it-swarm.com.de

Listen: Count vs Count ()

Welche Methode wird bei gegebener Liste bevorzugt, um die Anzahl der enthaltenen Elemente zu bestimmen?

var myList = new List<string>();

myList.Count
myList.Count()
95
Saxman

Count() ist eine von LINQ eingeführte Erweiterungsmethode, während die Eigenschaft Count Teil der List selbst ist (abgeleitet von ICollection). Intern prüft LINQ jedoch, ob Ihr IEnumerableICollection implementiert, und verwendet in diesem Fall die Eigenschaft Count. Letztendlich gibt es also keinen Unterschied, welchen Sie für ein List verwenden.

Um meinen Standpunkt weiter zu belegen, hier der Code von Reflector für Enumerable.Count()

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}
118
BFree

Ziehen Sie für einen Typ immer die Eigenschaften Count und Length der Erweiterungsmethode Count() vor. Ersteres ist ein O(1) für jeden Typ, der sie enthält. Die Erweiterungsmethode Count() verfügt über einige Optimierungen für die Typprüfung, die dazu führen können, dass sie auch in der Zeit O(1) ausgeführt wird, sich jedoch auf O(N) verschlechtert, wenn Die zugrunde liegende Sammlung ist nicht eine der wenigen Arten, die sie kennt.

23
JaredPar

myList.Count ist eine Methode für das Listenobjekt. Sie gibt nur den Wert eines Felds zurück und ist daher sehr schnell. Da es sich um eine kleine Methode handelt, die sehr wahrscheinlich vom Compiler (oder von der Laufzeit) eingebunden wird, kann der Compiler möglicherweise andere Optimierungen vornehmen.

myList.Count () ruft eine (von LINQ eingeführte) Erweiterungsmethode auf, die alle Elemente in einem IEnumerabl durchläuft und daher viel langsamer sein sollte.

In der Microsoft-Implementierung hat die Count-Erweiterungsmethode jedoch einen "Sonderfall" für Lists, in dem die Count-Eigenschaft der Liste verwendet werden kann. Dies bedeutet, dass die Count () -Methode nur geringfügig langsamer ist als die Count-Eigenschaft.

Es ist unwahrscheinlich, dass Sie in den meisten Anwendungen den Geschwindigkeitsunterschied feststellen können.

Wenn Sie also wissen, dass Sie es mit einer Liste zu tun haben, verwenden Sie die Count-Eigenschaft. Wenn Sie eine "unbekannte" IEnumerabl-Methode haben, verwenden Sie die Count () -Methode und lassen Sie sie für Sie optimieren.

10
Ian Ringrose

Wenn Sie zufällig den Typ Ihrer Sammlung ändern möchten, sollten Sie die Erweiterung Count() verwenden. Auf diese Weise müssen Sie Ihren Code nicht umgestalten (um beispielsweise Length zu verwenden).

7
Simon Fischer