假设我正在使用LINQ数组.Distinct()
方法。
结果是无序的。
如果你知道用于产生结果的逻辑,那么一切都是“有序的”。
我的问题是关于结果集。结果数组是否会处于“第一个不同”的顺序或者可能是“最后一个不同”的顺序?
我可以永远不依赖任何订单吗?
这是旧的“删除重复字符串”问题,但我正在研究LINQ解决方案。
答案 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)
猜测它正在使用哈希表来生成一组不同的键,并按哈希的顺序生成输出。