Hier ist ein Beispielcode, den ich im Grunde tausende Male in meinem Leben geschrieben habe:
%Vor%Und es scheint mir, C # sollte schon etwas haben, was das in einer Zeile macht. Etwas wie:
%Vor%Aber das gibt das Ding nicht zurück (oder einen Index für das Ding, was in Ordnung wäre), der den Wert der Anpassungsgüte zurückgibt.
Also vielleicht so etwas wie:
%Vor%Aber das macht eine ganze Art des gesamten Arrays und könnte zu langsam sein.
Gibt es das?
Ich denke nicht, dass dies im Standard-LINQ möglich ist, ohne das Enermable zu sortieren (was im allgemeinen Fall langsam ist), aber Sie können dazu die Methode MaxBy()
aus der MoreLinq-Bibliothek verwenden. Ich füge diese Bibliothek immer in meine Projekte ein, da sie so nützlich ist.
(Der Code sieht tatsächlich sehr ähnlich zu dem was Sie haben, aber verallgemeinert.)
Dies können Sie mit System.Linq tun:
%Vor% Wenn das Array leer sein kann, verwenden Sie .FirstOrDefault();
, um Ausnahmen zu vermeiden.
Sie wissen wirklich nicht, wie dies intern implementiert wird. Sie können also nicht sicherstellen, dass dies das gesamte Array sortiert, um das erste Element zu erhalten. Wenn es beispielsweise linq to sql ist, erhält der Server eine Abfrage, die die Sortierung und die Bedingung enthält. Es würde das Array nicht bekommen, dann sortiere es und dann das erste Element.
Tatsächlich wird der erste Teil der Abfrage nicht ausgewertet, bis Sie First nicht aufrufen. Ich meine, das ist keine zweistufige Auswertung, sondern eine einstufige Auswertung.
%Vor% Ich würde IComparable<Thing>
implementieren und einfach arrayOfThings.Max()
verwenden.
Beispiel hier: Ссылка
Ich denke, dies ist der sauberste Ansatz und IComparable kann an anderen Orten von Nutzen sein.
AKTUALISIEREN
Es gibt auch eine überladene Max
-Methode, die eine Projektionsfunktion verwendet, so dass Sie unterschiedliche Logik zum Erhalten von Höhe, Alter usw. bereitstellen können.
Ich folgte dem Link Porges, der im Kommentar aufgeführt ist, Verwendung von LINQ zum Auswählen eines Objekts mit minimalem oder maximalem Eigenschaftswert und Ausführen des folgenden Codes in LINQPad und verifiziert, dass beide LINQ-Ausdrücke die richtigen Antworten zurückgegeben haben.
%Vor%
Ergebnis von LinqPad