按两个属性的最高值排序列表

时间:2015-03-30 11:22:53

标签: c# linq

我有一个如下列表:

|Name|Val. Date 1| Val. Date 2|
|PA  |        200|         200|
|PB  |          0|         300|
|PC  |        200|           0|
|PD  |        150|         150|

按Val订购清单。 Date1会给我一些东西:PA,PC,PD和PB。如果我为Val做了类似的事情。日期2。

但我真正需要做的是按照日期1或日期2中记录的最高值来订购,结果如下:PB,PA,PC和PD。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

使用Math.Max()获取最大值,然后按顺序排序:

 list.OrderByDescending(x => Math.Max(x.Date1, x.Date2));

答案 1 :(得分:2)

由于您使用的是列表,因此可以使用List.Sort(Comparison<T>)对列表进行内联排序:

list.Sort((lhs, rhs) => 
(
    Math.Max(lhs.Val.Date1, lhs.Val.Date2) - 
    Math.Max(rhs.Val.Date1, rhs.Val.Date2)
));

如果您使用.ToList()将Linq解决方案的结果分配回列表,那么通过一个重要警告来进行就地排序会更有效:

List.Sort()不是稳定的排序,因此它不保留相等值的排序。然而,Linq OrderBy是稳定的。

答案 2 :(得分:0)

另一种方法是使用类似的东西:

var sortedList = ListOfData.OrderByDescending(x=>x.Val1).ThenByDescending(x=>x.Val2);

请参阅:
Multiple “order by” in LINQ
Ordering data in LINQ queries by more than one column
Multiple Field Sorting by Field Names Using Linq