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
.