Ja, Sie können den Overhead von List.IndexOf()
entfernen, indem Sie eine benutzerdefinierte Erweiterung Min()
erstellen. (Tatsächlich sollte Enumerable.Min()
eine Erweiterung haben, die das Element original nach Schlüssel auswählt, anstatt eine Umwandlung auszuwählen. Diese Aufsicht ist in Situationen wie dieser besonders schmerzhaft.)
Nach meiner Erfahrung sind die LINQ-Aggregationsmethoden wie Array.Max () und Array.Min () typischerweise langsamer als eine manuelle for-Schleife. Sie können so etwas als einen alternativen Ansatz betrachten:
%Vor%Sie können die Geschwindigkeiten beider Ansätze für Ihre Umgebung immer mit System.Diagnostics.StopWatch testen.
Es gibt ein Problem mit der Antwort von @cdhowie, da angenommen wird, dass ein IList<T>
effizient über den Indexer auf ein bestimmtes Objekt zugreifen kann. Während das für Arrays und List[T]
gilt, ist es in nono-Weise garantiert (nimm für ein Beispiel eine einfach verknüpfte Liste, die Ilist<T>
implementiert).
Wenn ich das auf generische Weise tun würde, würde ich etwas tun wie:
%Vor%Oder, vielleicht sauberer, da wir überflüssige Initialisierung und einen fremden Vergleich im Körper der Schleife loswerden:
%Vor% Sie könnten auch die Aktie Linq Aggregate()
overload verwenden, obwohl es nicht sauberer oder einfacher als die Brute-Force-Methode (wahrscheinlich auch weniger effizient, IMHO):
Wenn möglich, behalten Sie den min Wert / Index im Auge, während die Werte in der Liste platziert werden, so dass Sie nicht eine ganze Liste durchlaufen müssen. Wenn neue Werte zur Liste hinzugefügt werden, überprüfen Sie sie anhand des von Ihnen gespeicherten minimalen Werts und ändern Sie den neuen minimalen Wert nach Bedarf.
Natürlich ist das für Ihre Situation nicht geeignet.
Ich verbesserte @ cdhowies Beantworte ein wenig, um es mächtiger zu machen. Wenn es mehrere minimale Elemente gibt, gibt diese Methode die erste zurück.
%Vor% Min-Berechnung: Das Finden des Min
-Wertes in einer Sammlung kann nicht schneller als O (n) erfolgen, also ist es vielleicht nicht besser, aber nur ein anderer im Codestil.
Finding Step: Abhängig von Ihrem Problem können Sie eine spezielle Datenstruktur (zB Binärbaum, Heap-Baum, ...) verwenden, um den Index schneller zu finden.
Wenn Sie so etwas wie einen Min-Heap-Baum verwenden, können Sie den minimalen Wert mit O (1) als Aufwand für einige spezielle Add-, Remove-Funktionen erhalten.
Tags und Links optimization c# list .net-3.5