2015-07-14 17 views

Antwort

6

Dies wäre eine Möglichkeit (wenn auch mit irgendwelchen Mitteln nicht optimal):

List<Point> list = ...; 
Point maxPoint = list.OrderByDescending(p => p.X + p.Y).First(); 

Eine andere Möglichkeit, die viel besser durchführen sollten, Ihre Point Klasse modifizieren würde bedeuten IComparable<T> zu implementieren, wie folgt aus:

class Point : IComparable<Point> 
{ 
    double X, Y; 

    public int CompareTo(Point other) 
    { 
     return (X + Y).CompareTo(other.X + other.Y); 
    } 
} 

... die Sie dann erlauben würde, einfach tun:

List<Point> list = ...; 
Point maxPoint = list.Max(); 
+0

OrderByDescending Ihre gesamte Liste sortieren wird. Während das in Abhängigkeit von der Größe der Liste in Ordnung sein kann, müssen Sie sich daran erinnern, dass Sie eine O (n) -Operation in eine O (n log n) -Operation umwandeln. – aquinas

+0

@aquinas: stimme zu, ich bearbeite meine Antwort, um das deutlicher zu machen. Ich mag meine zweite Option jedoch besser. – sstan

+0

Nun, das setzt voraus, dass Sie der Besitzer der Point-Klasse sind, was nicht immer der Fall ist. – aquinas

0
var maxValue = list.Max(m => m.X + m.Y); 
var maxPoint = list.Where(p => p.X + p.Y == maxValue).FirstOrDefault(); 

für eine Hochland ..

oder

var largestPoints = list.Where(p => p.X + p.Y == maxValue); 

für Krawatten.

+1

Sie sollten Ihre Max-Funktion aus Ihrer Where-Klausel entfernen. So wie es jetzt aussieht, wäre die Leistung O (n^2). – aquinas

+0

@aquinas Guter Anruf. – ptilton

0

Es gibt nichts aus der Box. Sie könnten tun:

Point theMax = null; 
ForEach(x => theMax = (theMax == null || x.X + x.Y > theMax.X + theMax.Y ? x : theMax)); 

Aber natürlich ist das nicht sehr schön.

Was Sie wirklich wollen, ist Ihre eigene Erweiterungsmethode schreiben, und indem Sie Ihre eigenen schreiben, meine ich schamlos stehlen MoreLinq (https://code.google.com/p/morelinq/source/browse/MoreLinq/MaxBy.cs). Sie können auch verwenden: Install-Package MoreLinq.Source.MoreEnumerable.MaxBy

Dann können Sie einfach tun: var theMax = points.MaxBy(x => x.X + x.Y);

Denken Sie daran, die Schönheit/Macht der Linq ist, dass am Ende des Tages, es ist alles Erweiterungsmethoden. Vergiss nicht, dass du immer dein eigenes schreiben kannst, um das zu tun, was du brauchst. Natürlich hat das MoreLinq-Projekt normalerweise, was Sie brauchen. Es ist eine großartige Bibliothek.

2

Ich würde die interaktiven Erweiterungen des Microsoft Reactive Teams (NuGet "Ix-Main") hinzufügen. Sie haben eine Reihe von sehr nützlichen IEnumerable<T> Erweiterungen.

Dies ist diejenige, die Sie brauchen:

Point max = points.MaxBy(p => p.X + p.Y).First(); 
Verwandte Themen