Ich habe ein einfaches Array von Objekten:
%Vor% Ich möchte testen, ob diese Methode beliebige Kontakte zurückgibt. Ich mag die LINQ-Syntax für Any()
, weil sie hervorhebt, was ich erreichen möchte:
Ist das jedoch langsamer als nur die Länge des Arrays zu testen?
%Vor% Gibt es irgendeine Möglichkeit, herauszufinden, welche Art von Operation Any()
in diesem Fall ausführt, ohne dass Sie hier nachfragen müssen? So etwas wie ein Profiler, aber für In-Memory-Sammlungen?
Es gibt zwei Any()
Methoden:
1. Eine Erweiterungsmethode für IEnumerable<T>
2. Eine Erweiterungsmethode für IQueryable<T>
Ich nehme an, dass Sie die Erweiterungsmethode für IEnumerable<T>
verwenden. Das sieht so aus:
Grundsätzlich ist die Verwendung von Length == 0
schneller, da kein Iterator für das Array erstellt wird.
Wenn Sie Code auschecken möchten, der nicht Ihr ist (also Code, der bereits kompiliert wurde), wie zum Beispiel Any<T>
, können Sie eine Art Disassembler verwenden. Jetbrains hat einen gratis - Ссылка
Ja, es ist langsamer, weil es über die Elemente iteriert. Die Verwendung von Length
-Eigenschaft ist besser. Aber ich glaube nicht, dass es einen signifikanten Unterschied gibt, weil Any
true zurückgibt, sobald ein Gegenstand gefunden wird.
In Ihrem Fall ist Length
etwas besser :
Aber der Unterschied scheint vernachlässigbar zu sein.
In allgemeinem Fall ist Any
jedoch besser, weil beim ersten gefundenen Element stoppt
Ich muss den anderen Antworten völlig widersprechen. Es wird nicht über das Array iteriert . Es wird geringfügig langsamer sein, da es ein Array-Iterator-Objekt erstellen und MoveNext()
einmal aufrufen muss, aber diese Kosten sollten in den meisten Szenarien vernachlässigbar sein. Wenn Any()
den Code für Sie lesbarer macht, können Sie ihn verwenden.
Quelle: Decompiled Enumerable.Any<TSource>
code.
Tags und Links c# linq linq-to-objects