Gibt es eine LINQ-Erweiterung oder (eine sinnvolle / effiziente Reihe von LINQ-Entensions), die bestimmen, ob eine Auflistung mindestens 'x' Elemente enthält?

Ich habe Code, der wissen muss, dass eine Sammlung nicht leer sein darf oder nur ein Element enthält.

Im Allgemeinen möchte ich eine Erweiterung des Formulars:

bool collectionHasAtLeast2Items = collection.AtLeast(2);

Ich kann problemlos eine Erweiterung schreiben, die Auflistung auflisten und einen Indexer erhöhen, bis die angeforderte Größe erreicht ist oder keine Elemente mehr vorhanden sind. Gibt es jedoch bereits etwas im LINQ-Framework, das dies tun würde? Meine Gedanken (in der Reihenfolge, in der sie zu mir gekommen sind) sind:

bool collectionHasAtLeast2Items = collection.Take(2).Count() == 2; oder

bool collectionHasAtLeast2Items = collection.Take(2).ToList().Count == 2;

Was anscheinend funktioniert, obwohl das Verhalten, mehr Elemente als die Sammlung enthält, nicht definiert ist (in der Dokumentation)Enumerable.Take-Methodees scheint jedoch zu tun, was man erwarten würde.

Es ist nicht die effizienteste Lösung: Entweder einmal aufzählen, um die Elemente aufzunehmen, dann erneut aufzählen, um sie zu zählen, was nicht erforderlich ist, oder einmal aufzählen, um die Elemente aufzunehmen und dann eine Liste zu erstellen, um die count -Eigenschaft zu erhalten, die kein Enumerator ist -y, da ich die Liste eigentlich nicht will.

Es ist nicht schön, da ich immer zwei Behauptungen aufstellen muss, zuerst 'x' zu nehmen, dann zu überprüfen, ob ich tatsächlich 'x' erhalten habe, und es hängt von undokumentiertem Verhalten ab.

Oder vielleicht könnte ich verwenden:

bool collectionHasAtLeast2Items = collection.ElementAtOrDefault(2) != null;

Das ist jedoch semantisch nicht klar. Vielleicht ist es das Beste, das mit einem Methodennamen zu umschließen, der bedeutet, was ich will. Ich gehe davon aus, dass dies effizient sein wird, ich habe nicht über den Code nachgedacht.

Einige andere Gedanken verwendenLast(), aber ich möchte ausdrücklich nicht die ganze Sammlung durchzählen.

Oder vielleichtSkip(2).Any(), wieder nicht semantisch ganz offensichtlich, aber besser alsElementAtOrDefault(2) != null, obwohl ich denke, dass sie das gleiche Ergebnis produzieren?

Irgendwelche Gedanken?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage