LINQ .distinct方法如何排序?

Mat*_*hew 13 linq arrays string distinct

假设我正在使用LINQ数组.Distinct()方法.结果是无序的.

好吧,如果你知道用于产生结果的逻辑,那么一切都是"有序的".

我的问题是关于结果集.结果数组是否会处于"第一个不同"顺序或"最后一个不同"顺序?

我可以永远不依赖任何订单吗?

这是旧的"删除重复字符串"问题,但我正在研究LINQ解决方案.

Jon*_*eet 20

假设你的意思是LINQ to Objects,它基本上保留了到目前为止返回的所有结果的集合,并且只有在之前没有产生的情况下才产生"当前"项.因此,结果按原始顺序排列,删除了重复项.像这样的东西(除了错误检查等):

public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source)
{
    HashSet<T> set = new HashSet<T>();

    foreach (T item in source)
    {
        if (set.Add(item))
        {
            // New item, so yield it
            yield return item;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这不能保证 - 但我无法想象任何更明智的实施.这允许Distinct()尽可能地保持懒惰 - 数据尽可能快地返回,并且只缓冲最小量的数据.

依赖于这将是一个坏主意,但知道当前实现(显然)如何工作可能是有益的.特别是,您可以轻松地观察它在耗尽原始序列之前开始返回数据,只需创建一个在生成要使用的数据时记录的源Distinct,以及从接收数据时记录的源Distinct.

  • 您也可以使用Jon提供的实现添加您自己的扩展方法(例如DistinctOrdered <T>).这样,无论.NET Framework版本如何,您都将始终拥有已定义顺序的实现. (3认同)

Gab*_*ana 8

文件说:

"结果序列是无序的."

  • @matthew:好的,但你问"我能不能指望任何订单吗?" 由于文档清楚地表明结果是无序的,因此您不能指望任何订单.如果它今天按某种顺序,可能会改变下一个.NET错误修复,因为没有订单保证. (4认同)