Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

[ExtensionMethods] ExtraLINQ — Additional Extension Methods for LINQ to Objects
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
Attachments
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

beantworten | zitieren | melden

Zur Zeit sind folgende Erweiterungsmethoden enthalten:
Attachments
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von m0rius am .
Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von m0rius
Ist das eine Implementierung, wie du sie vorgesehen hast?
Ja, so in der Art würde ich eine Implementierung erwarten.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7559
Herkunft: Waidring

beantworten | zitieren | melden

Hallo m0rius,
Zitat

    
    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!"
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers