Hallo,
an dieser Stelle möchte ich euch mein neuestes Projekt vorstellen:
[SIZE]ExtraLINQ[/SIZE]
[B]ExtraLINQ[/B] ist eine Klassenbibliothek, die zusätzliche Erweiterungsmethoden für LINQ to Objects bereitstellt.
Den Quellcode findet ihr unter Github » ExtraLINQ.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Zur Zeit sind folgende Erweiterungsmethoden enthalten:
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
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.
Hallo dN!3L,
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
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo dN!3L,
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.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Ist das eine Implementierung, wie du sie vorgesehen hast?
Ja, so in der Art würde ich eine Implementierung erwarten. 👍
Hallo m0rius,
if (expectedMaxItemCount < 0) { throw new ArgumentException("The expected item count must not be negative.", "expectedMaxItemCount"); }
hier würde eine ArgumentOutOfRangeException besser passen.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hallo dN!3L,
super, dann habe ich dich richtig verstanden. Ich melde mich hier wieder, wenn ich die Änderungen vorgenommen und gepusht habe.
Hallo gfoidl,
du hast Recht, vielen Dank für den Hinweis. Wird geändert!
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
Hallo zusammen,
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?
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
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.
Hallo dN!3L,
jetzt ist der aktualisierte Quellcode auch auf GitHub verfügbar. Ich hatte deine Änderungen zwar direkt am 15. Oktober umgesetzt, aber noch nicht aktualisiert.
m0rius
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg