Von http://msdn.microsoft.com/en-us/library/ms132433.aspx:
den Wert dieser Eigenschaft Abrufen ist ein O (1) -Operation.
Dies garantiert, dass der Zugriff auf die Count
nicht über die gesamte Sammlung iterieren wird.
Edit: wie viele andere Plakate vorgeschlagen, IEnumerable<...>.Count()
ist jedoch nicht garantiert sein O (1). Verwenden Sie vorsichtig!
IEnumerable<...>.Count()
ist eine in definierte Erweiterungsmethode. Die aktuelle Implementierung führt einen expliziten Test durch, wenn die gezählte IEnumerable<T>
tatsächlich eine Instanz von ist und wenn möglich ICollection<T>.Count
verwendet. Sonst durchläuft es die IEnumerable<T>
(mögliche faule Auswertung zu erweitern) und zählt Elemente einzeln.
Ich habe jedoch in der Dokumentation nicht gefunden, ob es garantiert ist, dass IEnumerable<...>.Count()
O (1) verwendet, wenn möglich, habe ich nur die Implementierung in .NET 3.5 mit Reflector überprüft.
Notwendige späte Zugabe: viele beliebte Container nicht von Collection<T>
abgeleitet, aber dennoch ihre Count
Eigenschaft ist O (1) (das heißt, nicht über die gesamte Auflistung durchlaufen). Beispiele sind HashSet<T>.Count
(das ist wahrscheinlich das, was das OP fragen wollte), Dictionary<K, V>.Count
, LinkedList<T>.Count
, List<T>.Count
, Queue<T>.Count
, Stack<T>.Count
und so weiter.
Alle diese Sammlungen implementieren ICollection<T>
oder einfach nur ICollection
, so dass ihre Count
eine Implementierung von ICollection<T>.Count
(oder ICollection.Count
). Es ist nicht erforderlich, dass eine Implementierung von ICollection<T>.Count
eine O (1) -Operation ist, aber die oben erwähnten tun dies gemäß der Dokumentation.
(Hinweis beiseite: einige Behälter, zum Beispiel, Queue<T>
, implementieren nicht-generic ICollection
aber nicht ICollection<T>
, so dass sie "erben" die Count
Eigenschaft nur von von ICollection
.)
Gute Frage. Ich würde eine interne int hoffen, da es in den meisten Fällen ziemlich einfach wäre, aber ich weiß es nicht. – Tarka