为什么linq的except
扩展方法没有Except<TSource>
方法(IEnumerable<TSource>,HashSet<TSource>)
重载?
例如
var query = A.Except(B).where(x=>Criteria(x))
foreach(item in query)
{
B.add(item);
DoSomething(item);
}
鉴于B为HashSet<T>
,A为IEnumerable<T>
或ICollection<T>
在每次迭代Except
中,取O(| B |)时间。
为什么没有一个方法只需要O(1)时间,因为B无论如何都是Hashset。
更新
我粗暴的方式是
var query = A.where(x=>!B.contains(x)).where(x=>Criteria(x))
答案 0 :(得分:2)
此处在每次迭代中除了取O(| B |)时间
不,不。 Except
在内部实施,其集合类似于HashSet<T>
。你可以看一下Jon Skeet's proposed implementation in Edulinq。 B
中的所有元素都放在HashSet<T>
中,然后枚举A的元素;如果它们不在HashSet
(检查这是一个O(1)操作),它们将在输出序列中返回。