为什么linq的`except`扩展方法没有Except <tsource>方法(IEnumerable <tsource>,HashSet <tsource>)重载?</tsource> </tsource> </tsource>

时间:2011-08-27 12:40:50

标签: c# linq

为什么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))

1 个答案:

答案 0 :(得分:2)

  

此处在每次迭代中除了取O(| B |)时间

不,不。 Except在内部实施,其集合类似于HashSet<T>。你可以看一下Jon Skeet's proposed implementation in EdulinqB中的所有元素都放在HashSet<T>中,然后枚举A的元素;如果它们不在HashSet(检查这是一个O(1)操作),它们将在输出序列中返回。