Wie kann ich diese beiden LINQ-Abfragen in einem kombinieren?
%Vor% MaxBy
ist das, wonach Sie suchen: Ссылка benutze es so:
BEARBEITEN 1: Da Jason darauf hingewiesen hat, dass diese Methode nur verwendet werden soll, wenn Sie mit LINQ zu Objekten arbeiten. Wenn Sie eine Abfrage für eine Datenbank durchführen (und daher LINQ to SQL oder Ähnliches verwenden), sollten Sie einen anderen Ansatz verwenden.
Ihr scheint recht lesbar, aber wenn es Sie nicht zufriedenstellt, können Sie immer AsEnumerable
für das Objekt IQueryable
aufrufen und dann MaxBy
method verwenden.
BEARBEITEN 2: Eine Sache, die Sie in Ihrer Abfrage ändern könnten, ist die zweite Anweisung. Versuchen Sie, es wie folgt zu verkürzen (um Where
zu vermeiden):
Beachten Sie, dass das am besten ohne LINQ ist. Durchlaufen Sie einfach die Liste, verfolgen Sie das maximale Datum und den Punkt, an dem das erste Datum gefunden wurde:
%Vor%Jetzt iterieren Sie nur einmal und müssen nicht den Sortiervorgang durchführen.
Dies setzt voraus, dass Sie LINQ-to-Objects verwenden. Wenn dies nicht der Fall ist, wird die gesamte Sammlung aus der Datenbank (oder wo auch immer) abgerufen, was unerwünscht ist. In diesem Fall würde ich einfach die Methode verwenden, die Sie bereits haben.
Für Link-to-Objects (Aggregat wird in Linq-zu-Sql nicht unterstützt). Führt in N (n) aus (ok, eigentlich O (n + 1))
%Vor%Für diejenigen, die Probleme beim Lesen haben, ist der erste Parameter der Anfangswert für den Akkumulator, der normale Werte in der Liste zusammenfassen würde, aber hier wird nur der aktuell höchste Datensatz gehalten. Dann wird für jeden Datensatz in der Liste die Lambda-Funktion aufgerufen, wobei der höchste Wert und der nächste Wert angegeben wird. Es gibt die neue aktuelle höchste zurück.