2016-10-03 8 views
0

Ich versuche, eine Liste (wird auf diese Liste als Ergebnis beziehen) durch einen Wert in einer anderen Liste (Redeems).C# OrderByDescending auf Wert von Liste in einer anderen Liste

Die Ergebnisliste enthält die Redeems-Liste, und ich möchte das Ergebnis nach dem Feld "SumChosenJear" in der Liste "Einlösen" bestellen und Top 20 bekommen. Das habe ich erreicht, und theoretisch denke ich es sollte funktionieren.

result = result 
    .OrderByDescending(input => input.Redeems 
    .Select(input2 => input2.SumChosenYear) 
    .ToList()) 
    .Take(20) 
    .ToList(); 

Allerdings gibt es eine Ausnahme mit der Aussage "Atleast ein Objekt implementieren IComparable". Warum passiert das?

+0

'OrderByDescending' will' IComparable' (um Sie zu sortieren haben, vergleichen); Sie geben jedoch 'List ' oder ähnliche '... zurück. Wählen Sie (input2 => input2.SumChosenYear) .ToList()'. Zwei 'List ' kann nicht standardmäßig verglichen werden (was ist größer '[1, 2, 3]' oder '[0, 4, 7]'?) –

+0

Punkt genommen, das macht total Sinn. Wie würde ich es dann in diesem Feld bestellen? Das Feld "SumChosenYear" ist nur eine Dezimalzahl, also war ToListing ein Problem an meinem Ende. Wäre es eine Idee, ein Feld in der Liste "Einlösen" mit der Summe von SumChosenYear zu haben? – Jannik

+0

Wie viele Zeilen sind im Variablenergebnis enthalten? Ich habe vor ein paar Wochen denselben Fehler bekommen und festgestellt, dass die Liste leer ist. – jdweng

Antwort

1

Diese Zeile:

input.Redeems 
    .Select(input2 => input2.SumChosenYear) 
    .ToList() 

kehren Sie eine Liste und da Liste nicht IComparable implementieren Sie können diese Lambda innerhalb this overload of OrderByDescending extension setzen.

Sie haben grundsätzlich zwei Möglichkeiten:

Erste Option

cretae Ihre benutzerdefinierte Implementierung von IComparer für diese Liste (unter der Annahme SumChosenYear Eigenschaft ein int für diesen Zweck ist):

public class SumChosenYearListComparer : IComparer<List<int>> 
{ 
    public int Compare(List<int> x, List<int> y) 
    { 
     //Your custom comparison... 
    } 
} 

und dann verwenden Sie es mit this overload of OrderByDescending extension:

var result = result 
    .OrderByDescending(input => input.Redeems 
    .Select(input2 => input2.SumChosenYear) 
    .ToList(), new SumChosenYearListComparer()) 
    .Take(20) 
    .ToList(); 

Zweite Option

Sie können in dieser Liste auswählen, welches Element Sie im Vergleich verwenden möchten (vielleicht die max, min, erster oder letzter Wert oder vielleicht sogar die Summe aller Artikel).

Angenommen, Sie möchten, mit der max-Wert in der Liste comapre Ihr Code wie folgt aussehen könnte:

var result = result 
    .OrderByDescending(input => input.Redeems 
    .Max(input2 => input2.SumChosenYear)) 
    .Take(20) 
    .ToList(); 
Verwandte Themen