【问题标题】:LINQ: Enumerable.Distinct is the order specified or guaranteed? [duplicate]LINQ:Enumerable.Distinct 是指定的还是保证的顺序? [复制]
【发布时间】:2021-03-26 03:16:33
【问题描述】:

这是 Distinct from https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.distinct 的用法示例

List<int> ages = new List<int> { 21, 46, 46, 55, 17, 21, 55, 55 };

IEnumerable<int> distinctAges = ages.Distinct();

Console.WriteLine("Distinct ages:");

foreach (int age in distinctAges)
{
    Console.WriteLine(age);
}

/*
 This code produces the following output:

 Distinct ages:
 21
 46
 55
 17
*/

算法似乎很简单:迭代元素。如果当前元素未知,则将其复制到结果中,否则将其丢弃。

我想知道是否所有实现都需要给出这个结果,或者未来的实现是否也能输出 55​​、21、17、46?

【问题讨论】:

  • 虽然不能保证保持相同的顺序,但我非常怀疑实现会改变以导致不同的顺序。

标签: c# linq


【解决方案1】:

来自your link

备注

结果序列是无序的。

及以后:

Distinct<TSource>(IEnumerable<TSource>) 方法返回一个不包含重复值的无序序列

【讨论】:

  • 我当然读过文档。但表述中存在一定的歧义。让我们通过反转它来测试公式:“有序”序列意味着某种排序算法应用于 Enumerable。情况并非如此,因此它是“无序的”。因此,“无序”并没有说明(我们称之为)结果的“稳定性”。
  • “无序序列”表示不保证序列的顺序。
【解决方案2】:

似乎它总是按照您放置它们的顺序返回它们。我试过了,结果如下:

IEnumerable pippo = new List { 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 1, 4, 3, 5, 2, 1 , 2, 3, 5, 4, 2, 3, 4, 5, 1, 3, 5, 6, 7 };

pippo.Distinct() 不同的

迭代器 { 1, 2, 3, 4, 5, 6, 7 }

pippo.Distinct() 不同的

迭代器 { 1, 2, 3, 4, 5, 6, 7 }

pippo.Distinct() 不同的

迭代器 { 1, 2, 3, 4, 5, 6, 7 }

IEnumerable pippo = new List { 99, 12, 33 ,1,2,3,4,5,6,7,8,11,33,44,1,2,3,4,5,6,7 ,99};

pippo.Distinct() 不同的

迭代器 { 99, 12, 33, 1, 2, 3, 4, 5, 6, 7, 8, 11, 44 }

pippo.Distinct() 不同的

迭代器 { 99, 12, 33, 1, 2, 3, 4, 5, 6, 7, 8, 11, 44 }

pippo.Distinct() 不同的

迭代器 { 99, 12, 33, 1, 2, 3, 4, 5, 6, 7, 8, 11, 44 }

即使在不同的执行和实例中,我也得到了相同的结果。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
相关资源
最近更新 更多