Mal eine kleine Anmerkung zum Code: Du arbeitest oft mit Count() in deinen Erweiterungen. Die Benutzung von Iteratoren würde vieles etwas effektiver gestalten.
Die CountsMin-, CountsMax- und CountsExactly-Methoden würden bei unendlichen Auflistungen so beim Durchzählen in einer Endlosschleife hängen bleiben - was sie nicht müssten, da du ja die Grenze, bis zu der gezählt werden muss, um das Ergebnis (true/false) zu bestimmten, kennst. Zumal du in bestimmten Fällen ja schon vorher abbrechen kannst, ohne alle Elemente geholt/durchgezählt zu haben.
Ebenso deine Random-Erweiterungsmethode: Das würde für Auflistungen, die keine Collections sind, bedeuten, dass entweder alle Elemente gepuffert werden müssen oder die Auflistung zweimal durchlaufen werden muss. Unter C# in Depth: Downloads (Chapter12\RandomExtension) findest du eine Implementierung, die bei Collections mit Count() arbeitet und bei Nicht-Collections eine Möglichkeit verwendet, nur einmal über die Auflistung zu iterieren.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von dN!3L am .
vielen Dank für die Anmerkung — ich mache mich mal ans Überarbeiten und poste hier anschließend eine der Implementierungen.
Mittlerweile ist ExtraLINQ auch als NuGet-Package zu haben: install-package ExtraLINQ oder install-package extralinq (siehe NuGet » Packages » ExtraLINQ).
m0rius
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
meine Implementierung der CountsMax-Methode sieht nun folgendermaßen aus:
public static bool CountsMax<TSource>(this IEnumerable<TSource> source, int expectedMaxItemCount)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
if (expectedMaxItemCount < 0)
{
throw new ArgumentException("The expected item count must not be negative.", "expectedMaxItemCount");
}
int itemCount = 0;
foreach (TSource item in source)
{
itemCount++;
if (itemCount > expectedMaxItemCount)
{
return false;
}
}
return true;
}
Ist das eine Implementierung, wie du sie vorgesehen hast? Analog würden die Methoden CountsMin und CountsExactly aussehen.
ich habe nun sämtliche Verbesserungen (bis auf die Random-Erweiterungsmethode; die kommt noch) eingearbeitet und hochgeladen. Soweit vielen Dank dafür!
Habt ihr ansonsten zusätzliche Anregungen oder Vorschläge für weitere Erweiterungsmethoden?
Eins ist mir noch aufgefallen: Du verwendest die Count-Methode jetzt ja gar nicht mehr. Wenn eine Auflistung aber eine Count-Methode anbietet, wäre dessen Verwendung besser bzw. sicherlich schneller/ressourcenschonender als die Verwendung des Enumerators. Ich würde noch eine "Early-Exit-Strategie" einbauen:
ICollection collection = source as ICollection;
if (collection!=null)
{
... collection.Count ...
}
Thema Anregungen & Vorschläge: Du hast ja nicht erwähnt, welchen Zweck ExtraLINQ genau haben soll (außer "Erweiterungsmethoden für LINQ2Objects"). Aber du scheinst dich auf Auflistungen und Zählen spezialisiert zu haben :)
Ne Idee von mir: Gib mir die kürzere/längere Auflistung zurück.
jetzt ist der aktualisierte Quellcode auch auf GitHub verfügbar. Ich hatte deine Änderungen zwar direkt am 15. Oktober umgesetzt, aber noch nicht aktualisiert.