Laden...

[ExtensionMethods] ExtraLINQ — Additional Extension Methods for LINQ to Objects

Erstellt von m0rius vor 12 Jahren Letzter Beitrag vor 12 Jahren 7.462 Views
m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren
[ExtensionMethods] ExtraLINQ — Additional Extension Methods for LINQ to Objects

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

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren

Zur Zeit sind folgende Erweiterungsmethoden enthalten:

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

2.891 Beiträge seit 2004
vor 12 Jahren

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.

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren

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

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren

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

2.891 Beiträge seit 2004
vor 12 Jahren

Ist das eine Implementierung, wie du sie vorgesehen hast?

Ja, so in der Art würde ich eine Implementierung erwarten. 👍

6.911 Beiträge seit 2009
vor 12 Jahren

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!"

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren

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

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren

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

2.891 Beiträge seit 2004
vor 12 Jahren

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.

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 12 Jahren

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