我有一个类似以下的列表:
|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 按字段名称进行多字段排序