LINQ .distinct方法如何排序?

时间:2010-11-05 20:48:03

标签: linq arrays string distinct

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

如果你知道用于产生结果的逻辑,那么一切都是“有序的”。

我的问题是关于结果集。结果数组是否会处于“第一个不同”的顺序或者可能是“最后一个不同”的顺序?

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

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

5 个答案:

答案 0 :(得分: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;
        }
    }
}

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

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

答案 1 :(得分:8)

docs说:

“结果序列无序。”

答案 2 :(得分:3)

你永远不能指望任何订单。 LINQ完全允许使用哈希表来实现它(事实上,我相信它是在.NET 4中实现的。)

答案 3 :(得分:1)

就我所知,Distinct方法并未正式保证订单,尽管实际上LINQ to Objects实现按照它们首次出现在源可枚举中的顺序返回组。

如果您使用LINQ to SQL,那么由数据库来决定它希望返回结果的顺序,然后您不应该依赖此顺序,即使从一个调用到下一个调用也是一致的。

答案 4 :(得分:1)

猜测它正在使用哈希表来生成一组不同的键,并按哈希的顺序生成输出。