按两个属性中的最高值对列表进行排序



我有一个类似以下的列表:

|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.Date2做类似的事情。

但我真正需要做的是,按日期1或日期2中记录的最高值排序,结果是:PB、PA、PC和PD。

我该如何解决这件事?

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

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

由于您使用的是列表,因此可以使用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()不是一个稳定的排序,因此它不保留相等值的排序。然而,LinqOrderBy是一个稳定的排序。

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

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

请参阅:
LINQ中的多个"订单依据"
LINQ查询中的数据按多列排序
使用Linq 按字段名称进行多字段排序

最新更新