你连接的答案是正确的。按多个值排序的关键在于,次要属性仅在主属性相等时才重要。您的排序比较的伪代码实现可能如下:
compare x and y position
if they differ, return order
else compare name, return order
在
Sort
方法中,跟随
(x,y)=>
的代码必须返回0,如果项目相等,则返回负数表示第一个应该在第二个之前,返回正数表示第二个应该在第一个之前。基于这些情况和其参数,
CompareTo
方法将返回-1、0或1。由于需要比较两个不同的属性,因此需要调用两次
CompareTo
。如果您决定将它们加在一起,您可能会遇到以下情况:
- x.position < y.position (比较返回-1)
- x.name > y.name (比较返回1)
- 结果为0,项目被视为相等,在这种情况下,您的规则明确说明x应该首先出现。
为了解决这个问题,我们需要确保只有当位置相等时才比较名称。由于
CompareTo
只返回-1、0或1,如果将位置结果乘以2(或任何更大的数字),则只有在位置相等时名称比较才会改变结果。(因为
-2+1=-1
和
2-1=1
)
因此,使用你原来链接答案中的方法,你的代码应该是这样的:
list.Sort((x, y) =>
2 * x.Position.CompareTo(y.Position)
+ x.Name.CompareTo(y.Name));