如果多个条目具有相同的值,List.OrderBy() 的结果是什么?

5

我使用ListsOrderBy()方法时出现了奇怪的问题。

假设你有一个列表,每个人都有FirstnameLastnameGender。如果这个列表中的所有人都是"m"性别的话,在每次调用OrderBy()方法后,排序结果将会不同。

list.OrderBy(p => p.Gender)

但我不希望我的列表在每次刷新时都跳来跳去。有什么想法吗?

2
由于OrderBy使用的是稳定排序,因此您不会得到不同的顺序。您是否使用基于数据库的提供程序,例如Linq-To-Entities?“此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定的排序不保留具有相同键的元素的顺序。” - Tim Schmelter
如果列表中所有人都是男性,为什么要按照性别排序呢? - Mahdi
是的,它是数据库驱动的,并且对象每15秒钟创建一次。也许这就是原因。 - Thomas Hahn
这只是一个例子。想象一下,列表中有一个女性。她将始终出现在顶部。但所有男性条目将在彼此之间随机排序(在我的情况下)。 - Thomas Hahn
1
我认为不能经常或大声地说:LINQ排序是__稳定的__,因此它们不会弄乱预先排序的元素.. 最后 :-) - TaW
3个回答

8
您可以使用ThenBy()方法按照其他属性对具有相同性别的对象进行排序。示例如下:
list.OrderBy(p=>p.Gender).ThenBy(p=>p.FirstName);

谢谢。这就是解决方案。但我仍然想知道C#是如何排序条目的,或者为什么顺序总是不同。 - Thomas Hahn

1
在你的代码中,Gender m 是一个字符串类型,并且有许多结果使用了 m,但它不是可排序实体。因此,当你尝试使用该属性进行排序时,它会随机地使用 m 进行排序。尝试使用其他具有可排序实体的内容进行排序,比如 FirstName
list.OrderBy(p=>p.Firstname);

or

list.OrderBy(p=>p.Lastname);

或者

list.OrderBy(p=>p.Gender).ThenBy(p=>p.FirstName);

1

按所有字段排序,例如:

list.OrderBy(x=>x.Gender).ThenBy(x=>x.FirstName).ThenBy(x=>x.LastName);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接