C# 按两个属性中的最大值对列表排序

C# 按两个属性中的最大值对列表排序,c#,linq,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.Date 2做类似的事情 但我真正需要做的是,按日期1或日期2记录

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

|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.Date 2做类似的事情

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

如何解决此问题?

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

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

由于您使用的是列表,所以可以使用以下命令对列表进行内联排序:

如果您使用
.ToList()
将Linq解决方案的结果分配回列表,那么使用就地排序将更有效,但需要注意一点:


List.Sort()
不是一种稳定的排序,因此它不会保留相等值的顺序。但是,Linq
OrderBy
是一种稳定的排序方式。

另一种方法是使用如下内容:

var sortedList = ListOfData.OrderByDescending(x=>x.Val1).ThenByDescending(x=>x.Val2);
请参阅:



列表的结构是什么为什么不创建一个具有max(Val1,Val2)值的新属性,并按此值排序?到目前为止您尝试了什么?你被困在哪里?通过发布您的代码来改进您的问题。如果您添加一个
,然后使用两个值的总和降序
,则它应该适用于边界情况;9@CarstenKönig:不能从这个问题推断这是期望的行为。OP要求按两个属性的最大值排序,此解决方案提供了。OP希望通过使用相同索引号的两个数字的最高位来对列表排序,因此它使用
300
,而不是
PC
使用
0
。它应该将这两个数字与相同的索引号进行比较,看看最高的是哪一个,然后只使用最高的数字对列表进行排序。提供的答案符合我的要求。我知道有一个办法可以和linq一起做,但我不记得上过数学课:)
var sortedList = ListOfData.OrderByDescending(x=>x.Val1).ThenByDescending(x=>x.Val2);