Distinct()方法是否总是保留列表中的第一个元素?

16

Would

int[] nums = { 2, 3, 3, 4, 2, 1, 6, 7, 10 };
var distinct = nums.Distinct();

是否始终按照这个顺序返回2、3、4、1、6、7、10

3个回答

18

Enumerable.Distinct 的定义行为是返回一个无序的集合 (文档)。

然而,Linq to Objects 中 Distinct 的当前实现将保留顺序。虽然其他 LINQ 提供程序不保证此行为,但不应依赖此行为。


它有时会返回{3, 2, 4, 10, 6, 7, 1}(例如)而不是按照遇到项目的顺序返回?您是否有任何相关链接或示例代码? - Cornelius
Queryable.Distinct的答案类似(它返回一个无序序列),请参见DISTINCT()和ORDERBY问题 - Michael Freidgeim

3

我认为"unordered"一词意味着与原始序列相同的顺序。
因此,调用者应决定是否对结果进行排序。


7
你认为“无序”的意思是“按照特定的顺序”?这个想法有点奇怪! :-) “无序”实际上是指“没有特定的顺序”。 - Eric Lippert
@Eric:希望你能看到这条评论。我的意思是(我认为是暗示),返回值序列的顺序不会被修改(即返回序列的顺序与传入序列相同)。我在哪里说“无序”表示特定的顺序?因此,根据上述情况 int[] nums = { 2, 3, 3, 4, 2, 1, 6, 7, 10 };,返回的序列不会对返回值进行排序,并将返回 2,3,4,1,6,7,10 - shahkalpesh
3
那个顺序——原始序列出现的顺序——是一个具体的顺序,是数百万种可能顺序中的一种。该方法的文档并不保证选择这个具体的顺序。在实践中,通常会选择这个具体的顺序。但是,在文档中所说的“无序”意味着实现可以选择任何顺序。有时候,不保留原始顺序会更有效率。 - Eric Lippert

0
一般而言:不行,但在你的情况下(使用一个整型数组):可能是。我猜他们只是枚举集合并忽略已经遇到的项。但是不要指望这种行为在不同版本的.NET或不同类型的集合中都能得到保证。
正如JaredPar在他的回答中指出的那样,结果被规定为无序的。如果你想要一些特定的排序,你需要在之后使用任何在你的情况下有意义的算法进行排序。

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