Einfache Prüfung, um festzustellen, ob mindestens ein Objekt in einer Menge den Wert TRUE hat

7

Ich habe eine Reihe von Modellobjekten mit einer öffentlichen IsVisible boolean-Eigenschaft. Alles, was ich tun muss, ist herauszufinden, ob mindestens einer der Sets diesen Wert auf TRUE gesetzt hat. Mit anderen Worten, wenn ich 10.000 Objekte habe, aber das zweite ist true , muss ich mich nicht durch die anderen 9.998 drehen. Ich habe bereits meine Antwort.

Jetzt weiß ich, dass ich meine eigene Iterationsfunktion schreiben und beim ersten Wert " True " ausbrechen könnte, aber ich hoffe, dass LINQ dies tun kann. Eigentlich muss es nicht einmal LINQ sein. Irgendwelche Vorschläge sind willkommen.

BTW, die Sprache der Wahl ist C #.

Aktualisierung:

Siehe meinen letzten Beitrag hier. Ich habe Testcode und Timings hinzugefügt. Es scheint, dass LINQ im Vergleich zum Test einfach verdammt schlecht ist. Klar ist es einfacher zu schreiben, aber in missionskritischen Timings bin ich mir nicht mehr sicher.

Was mich allerdings überrascht hat, ist, dass ich die meiste Zeit mit diesen Ergebnissen, der Enumeration und einem fairen Clip gearbeitet habe, aber aus irgendeinem Grund, als ich den Test in mehreren Durchgängen umwandelte, scheint er mit einem Cache gecheckt zu haben zählen als am schnellsten.

Ich bemerkte auch, dass, wenn ich nicht alles auf "falsch" zurücksetze, alle verbleibenden / wiederholten Tests VIEL schneller zu sein scheinen. Irgendwie ändert sich alles, wenn man alles auf FALSE setzt (was absichtlich zu viel war, um genau das zu testen ...).

Interessant. Ich bin mir nicht sicher, auf welche Art ich jetzt gehen werde. Dieses ist nicht ein geschäftskritisches System, also werde ich vielleicht auf Lesbarkeit gehen, aber trotzdem. Interessant.

    
MarqueIV 19.09.2010, 07:15
quelle

3 Antworten

16

Die Methode, nach der Sie suchen, ist Enumerable.Any .

%Vor%

Dies hat die exakte Kurzschlusssemantik, nach der Sie suchen; Der Beispielcode ähnelt:

%Vor%     
Ani 19.09.2010, 04:32
quelle
3

Wenn Sie ein Objekt tatsächlich finden müssen, verwenden Sie einfach die Methode .First oder .FirstOrDefault:

%Vor%

oder

%Vor%

Der einzige Unterschied zwischen ihnen besteht darin, dass die Methode .First eine Ausnahme auslöst, wenn kein solches Objekt in der Sammlung vorhanden ist, wenn die zweite Methode den Standardwert (null in diesem Beispiel) zurückgibt.

Wenn Sie nur prüfen müssen, ob ein Objekt mit dieser Eigenschaft vorhanden ist, verwenden Sie

%Vor%

Alle diese Methoden stoppen die Iteration durch die Sammlung, sobald das entsprechende Objekt gefunden wurde.

Wenn Sie überprüfen, ob alle Objekte sichtbar / unsichtbar sind, können Sie Folgendes tun:

%Vor%

Aber .Alle Methode wird alle Elemente aufzählen (was aus dem Namen ersichtlich ist).

    
Alexey Raga 19.09.2010 05:31
quelle
0

Hier ist eine ".Any ()" Implementierung:

%Vor%

Also hier ist es, nichts "Besonderes" mit .Any (), es ist nur ein Wrapper um "foreach". Nichts Besonderes, um dort zu testen und nichts an der Mikro-Mikro-Mikro-Optimierung zu schuld.

    
Alexey Raga 19.09.2010 10:07
quelle

Tags und Links