2016-10-03 86 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();