2016-10-03 24 views
0

我試圖通過另一個列表(Redeems)中的值來排序列表(將引用此列表作爲結果)。C#OrderByDescending從另一個列表中的值列表

結果列表包含Redeems列表,我想在「Redeems」列表中的字段「SumChosenYear」排序結果並獲得前20名。這是我設法得到的結果,理論上我認爲它應該工作。

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

但是它拋出一個異常說「至少一個對象實現IComparable」。爲什麼會發生?

+0

'OrderByDescending'想'IComparable'(在順序排序,你要比較);但是你返回'List ''或者'... Select(input2 => input2.SumChosenYear).ToList()'。兩個'List '不能在默認情況下進行比較(什麼是較大的[[1,2,3]或者[0,4,7]?) –

+0

點,這是完全合理的。那我怎麼去訂購那個領域呢? 「SumChosenYear」字段只是一個小數,因此在我的結尾列出它是一個問題。在SumChosenYear的總和中列出一個字段「Redeem」是否是一個想法? – Jannik

+0

變量結果中有多少行。幾周前我收到了同樣的錯誤,並發現列表爲空。 – jdweng

回答

1

這條線:

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

回報你一個列表,並因爲名單沒有實現IComparable你不能把這個拉姆達內this overload of OrderByDescending extension

您有兩種基本選擇:

第一選項

Cretae的​​此列表您的自定義實現(假設SumChosenYear屬性是用於此目的的一個int):

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

然後與this overload of OrderByDescending extension一起使用:

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

第二個選項

你可以選擇你想在比較(也許最大值,最小值,第一個或最後一個值或可能所有的項目甚至總和)使用在這個列表項。

假設你想使用該列表中的最大值,你的代碼可能看起來像這comapre:

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