Muss ich das Count () einer Enumerable vor foreach überprüfen

7

Gibt es eine Verbesserung der Geschwindigkeit oder Punkt in der Überprüfung der Count() einer Enumerable vor dem Iterieren / Vorarbeiten über die Sammlung?

%Vor%     
Coops 08.01.2014, 08:45
quelle

5 Antworten

17

Nein, das Gegenteil kann wahr sein. Wenn es sich nicht um eine Sammlung handelt (wie zum Beispiel List oder Array ), sondern um eine zurückgestellte, ausgeführte Abfrage, muss sie vollständig ausgeführt werden, was sehr teuer sein kann, nur um die Anzahl zu bestimmen. In deinem Beispiel ist es tatsächlich ein List , Enumerable.Count ist schlau genug um zu versuchen, es zuerst auf ein ICollection<T> / ICollection zu werfen. Wenn das gelingt, wird die Eigenschaft Count verwendet.

Also benutze einfach foreach . Es tut nicht weh, wenn die Sequenz leer ist, die Schleife wird sofort verlassen.

Aus demselben Grund ist es besser, Enumerable.Any anstelle von Count() > 0 zu verwenden, wenn Sie nur überprüfen möchten, ob eine Sequenz mindestens ein Element enthält. Die Absicht ist auch klarer.

    
Tim Schmelter 08.01.2014, 08:49
quelle
2

Wenn Ihr Enumarable faul ausgewertet wird (LINQ), ist der Aufruf von Count() tatsächlich sehr schlecht, da es die gesamte Enumerable auswertet.

Da foreach nicht ausgeführt wird, wenn das Enumarable leer ist, ist es am besten, Count nicht zu verwenden.

    
Martin Walter 08.01.2014 08:52
quelle
1

Ich glaube nicht, dass es eine Geschwindigkeitsverbesserung gibt oder tatsächlich darauf hinweist, das Count() einer Enumerable zu überprüfen, bevor ich über die Sammlung iteriere / forsche. Da innerhalb des Foreach-Blocks kein Code ausgeführt wird, wenn ohnehin keine Objekte in der Sammlung vorhanden sind.

    
Coops 08.01.2014 08:46
quelle
1

Kurze Antwort: Nein, im Gegenteil.
Längere Antwort: Das Schlüsselwort foreach ruft Methoden auf der Schnittstelle IEnumerator auf. Diese Methoden überprüfen implizit, ob Elemente vorhanden sind. Der Aufruf von Count() ist also rein redundant.

    
Thomas Weller 08.01.2014 08:51
quelle
0

Auch wenn Sie nach der Anzahl suchen möchten, verwenden Sie Count anstelle der Erweiterungsmethode Count (), da die Leistung von Count () schlechter ist als Count

    
Patrick Hofman 08.01.2014 08:49
quelle

Tags und Links