Wenn ich mit einer Sammlung arbeite, habe ich zwei Möglichkeiten, die Anzahl der Objekte zu ermitteln. Count (die Eigenschaft) und Count () die Methode. Weiß jemand, was die Hauptunterschiede sind? Ich könnte mich irren, aber ich verwende die Count-Eigenschaft immer in allen bedingten Anweisungen, da ich davon ausgehe, dass die Count () -Methode eine Art Abfrage für die Auflistung ausführt, bei der Count bereits zugewiesen worden sein muss, bevor ich sie abrufe. Aber das ist eine Vermutung - ich weiß nicht, ob die Leistung beeinträchtigt wird, wenn ich falsch liege.
EDIT: Wird Count () dann aus Neugier eine Ausnahme auslösen, wenn die Sammlung null ist? Weil ich mir ziemlich sicher bin, dass die Count-Eigenschaft einfach 0 zurückgibt.
.
Operator auf etwas anzuwenden, das null ist.Antworten:
Das Dekompilieren der Quelle für die
Count()
Erweiterungsmethode zeigt, dass getestet wird, ob das Objekt einICollection
(generisches oder anderes) Objekt ist, und wenn ja, einfach die zugrunde liegendeCount
Eigenschaft zurückgegeben wird:Wenn Ihr Code also zugreift,
Count
anstatt aufzurufenCount()
, können Sie die Typprüfung umgehen - ein theoretischer Leistungsvorteil, aber ich bezweifle, dass dies spürbar wäre!quelle
Count()
nicht nach der nicht generischenICollection
Schnittstelle gesucht wird. Dies wurde nur in .NET 4 hinzugefügt. Sowohl 3.5 als auch 4 prüfen die generischeICollection<T>
Schnittstelle.Leistung ist nur ein Grund, sich für den einen oder anderen zu entscheiden. Wenn Sie .Count () auswählen, wird Ihr Code allgemeiner. Ich hatte Gelegenheiten, in denen ich Code überarbeitet habe, der keine Sammlung mehr produzierte, sondern etwas allgemeineres wie eine IEnumerable, aber anderer Code ist infolgedessen kaputt gegangen, weil er davon abhing
.Count
und ich ihn ändern musste.Count()
. Wenn ich darauf hinweisen würde,.Count()
überall zu verwenden , wäre der Code wahrscheinlich wiederverwendbarer und wartbarer. Normalerweise ist es die beste Wahl, die allgemeineren Schnittstellen zu verwenden, wenn Sie damit durchkommen können. Mit allgemeiner meine ich die einfachere Schnittstelle, die von mehr Typen implementiert wird und somit eine größere Kompatibilität zwischen Code ermöglicht.Ich sage nicht, dass
.Count()
es besser ist, ich sage nur, dass es andere Überlegungen gibt, die sich mehr mit der Wiederverwendbarkeit des Codes befassen, den Sie schreiben.quelle
Die
.Count()
Methode ist möglicherweise intelligent genug oder kennt den betreffenden Typ. In diesem Fall wird möglicherweise die zugrunde liegende.Count
Eigenschaft verwendet.Andererseits könnte es nicht.
Ich würde sagen, es ist sicher anzunehmen, dass wenn die Sammlung selbst eine
.Count
Eigenschaft hat, dies die beste Wahl ist, wenn es um die Leistung geht.Wenn die
.Count()
Methode nichts über die Auflistung weiß, zählt sie darüber auf, was eine O (n) -Operation ist.quelle
Count
Eigenschaft könnte besser sein, aber dieCount()
MethodenerstellungICollection<T>.Count
wird hier irgendwie dokumentiert: msdn.microsoft.com/en-us/library/bb338038(v=vs.110).aspxDie Count () -Methode ist eine Erweiterungsmethode, die jedes Element einer IEnumerable <> iteriert und zurückgibt, wie viele Elemente vorhanden sind. Wenn die Instanz von IEnumerable tatsächlich eine Liste <> ist, ist sie so optimiert, dass die Count-Eigenschaft zurückgegeben wird, anstatt alle Elemente zu iterieren.
quelle
Count()
gibt es als Erweiterungsmethode von LINQ -Count
ist eine Eigenschaft fürList
s, tatsächliche .NET-Auflistungsobjekte.Als solches
Count()
wird es fast immer langsamer sein, da es das Sammlungs- / abfragbare Objekt auflistet. Auf einer Liste, Queue, Stapel usw., verwendenCount
. Oder für ein Array -Length
.quelle
Wenn es eine Count- oder Length-Eigenschaft gibt, sollten Sie diese immer der Count () -Methode vorziehen, die im Allgemeinen die gesamte Sammlung iteriert, um die Anzahl der darin enthaltenen Elemente zu zählen. (Ausnahmen sind beispielsweise, wenn die Count () -Methode gegen eine Linq to SQL- oder Linq to Entities-Quelle gerichtet ist. In diesem Fall wird eine Count-Abfrage für die Datenquelle durchgeführt. Selbst dann, wenn eine Count-Eigenschaft vorhanden ist, würden Sie dies tun möchte das vorziehen, da es wahrscheinlich weniger Arbeit zu tun hat.)
quelle
Die Count () -Methode ist die LINQ-Methode, die auf jedem IEnumerable <> funktioniert. Sie würden erwarten, dass die Count () -Methode über die gesamte Sammlung iteriert, um die Anzahl zu ermitteln, aber ich glaube, dass der LINQ-Code tatsächlich einige Optimierungen enthält, um festzustellen, ob eine Count-Eigenschaft vorhanden ist, und wenn ja, verwenden Sie diese.
Also sollten beide fast identische Dinge tun. Die Count-Eigenschaft ist wahrscheinlich etwas besser, da dort keine Typprüfung erforderlich ist.
quelle
Kurzversion: Wenn Sie die Wahl zwischen einer
Count
Eigenschaft und einerCount()
Methode haben, wählen Sie immer die Eigenschaft.Der Unterschied liegt hauptsächlich in der Effizienz des Betriebs. Alle BCL-Sammlungen, die eine
Count
Eigenschaft verfügbar machen, tun dies auf O (1) -Methode. DieCount()
Methode kann und wird jedoch häufig O (N) kosten. Es gibt einige Überprüfungen, um zu versuchen, es für einige Implementierungen auf O (1) zu bringen, aber es ist keineswegs garantiert.quelle