Frage

Was ist der beste/einfachste Weg, die Anzahl der Elemente in einer IEnumerable-Sammlung zu ermitteln, ohne alle Elemente in der Sammlung aufzulisten?

Möglich mit LINQ oder Lambda?

War es hilfreich?

Lösung

Sie müssen aufzählen, um eine Zählung zu erhalten.Andere Konstrukte wie die Liste führen eine laufende Zählung durch.

Andere Tipps

Die Lösung hängt davon ab, warum Sie die Sammlung nicht auflisten möchten.

Wenn das Aufzählen der Sammlung möglicherweise langsam ist, gibt es keine Lösung, die schneller ist.Wenn möglich, sollten Sie stattdessen die Verwendung einer ICollection in Betracht ziehen.Es sei denn, die Aufzählung ist bemerkenswert langsam (z. B.Es liest Elemente von der Festplatte. Die Geschwindigkeit sollte jedoch kein Problem darstellen.

Wenn das Aufzählen der Sammlung mehr Code erfordert, wurde dieser bereits in Form der Erweiterungsmethode .Count() für Sie geschrieben.Verwenden Sie einfach MyEnumerable.Count().

Wenn Sie die Sammlung nach dem Zählen aufzählen möchten, ist dies mit der Erweiterungsmethode .Count() möglich.Sie können .Count() sogar für eine Sammlung aufrufen, die Sie gerade aufzählen, und sie wird dort fortgesetzt, wo sie sich vor der Zählung befand.Zum Beispiel:

foreach (int item in Series.Generate(5))
{
    Console.WriteLine(item + "(" + myEnumerable.Count() + ")");
}

werde die Ergebnisse liefern

0 (5)

1 (5)

2 (5)

3 (5)

4 (5)

Wenn es daran liegt, dass die Aufzählung Nebenwirkungen hat (z. B.schreibt auf Festplatte/Konsole) oder ist von Variablen abhängig, die sich zwischen Zählen und Aufzählen ändern können (z. B.liest von der Festplatte) [N.B.Wenn möglich, würde ich vorschlagen, die Architektur zu überdenken, da dies viele Probleme verursachen kann.] Dann ist eine Möglichkeit, die in Betracht gezogen werden sollte, das Einlesen der Aufzählung in einen intermittierenden Speicher.Zum Beispiel:

List<int> seriesAsList = Series.Generate(5).ToList();

Bei allen oben genannten Punkten wird davon ausgegangen, dass Sie den Typ nicht ändern können (d. h.es wird von einer Bibliothek zurückgegeben, die Ihnen nicht gehört).Wenn möglich, sollten Sie einen Wechsel zur Verwendung einer ICollection oder IList (ICollection hat einen größeren Gültigkeitsbereich als IList) in Betracht ziehen, die über eine Count-Eigenschaft verfügt.

In jedem Fall muss man es durchschleifen.Linq bietet die Count Methode:

var result = myenum.Count();

Benutze das.

IEnumerable list =..........;

list.OfType<T>().Count()

es wird die Anzahl zurückgegeben.

Es gibt auch IList oder ICollection, wenn Sie ein Konstrukt verwenden möchten, das noch einigermaßen flexibel ist, aber auch über die von Ihnen benötigte Funktion verfügt.Beide implizieren IEnumerable.

Es kommt auch darauf an, was Sie mit dem Zählen erreichen wollen.Wenn Sie herausfinden möchten, ob die aufzählbare Sammlung Elemente enthält, können Sie Folgendes verwenden

myEnumerable.Any() über myEnumerable.Count() wobei ersteres das erste Element und letzteres alle Elemente ergibt.

Ein IEnumerable muss jedes Element durchlaufen.um die vollständige Zählung zu erhalten.Wenn Sie nur überprüfen müssen, ob ein oder mehrere Elemente in einem IEnumerable vorhanden sind, besteht eine effizientere Methode darin, zu überprüfen, ob welche vorhanden sind.Any() prüft nur, ob ein Wert vorhanden ist, und durchläuft nicht alles.

IEnumerable myStrings = new List(){"eins", "zwei", "drei"};

bool hasValues ​​= myStrings.Any();

Mit LINQ nicht möglich, da der Aufruf von .Count(...) die Sammlung aufzählt.Wenn Sie auf das Problem stoßen, dass Sie eine Sammlung nicht zweimal durchlaufen können, versuchen Sie Folgendes:

List<MyTableItem> myList = dataContext.MyTable.ToList();
int myTableCount = myList.Count;

foreach (MyTableItem in myList)
{
   ...
}

Wenn Sie zählen und dann eine Schleife ausführen müssen, ist eine Liste möglicherweise besser geeignet.

Wenn Sie count verwenden, um nach Mitgliedern zu suchen, können Sie Folgendes verwenden Any() um zu vermeiden, dass die gesamte Sammlung aufgelistet wird.

Die beste Lösung besteht meiner Meinung nach darin, Folgendes zu tun:

  1. mit System.Linq.Dynamic;
  2. myEnumerable.AsQueryable().Count()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top