为什么linq's的' except '扩展方法没有except 方法(IEnumerable

本文关键字:方法 except TSource IEnumerable 扩展 linq 为什么 | 更新日期: 2023-09-27 18:06:53

为什么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反正是哈希集。

我的方法是

var query = A.where(x=>!B.contains(x)).where(x=>Criteria(x))

为什么linq's的' except '扩展方法没有except <TSource>方法(IEnumerable

这里每次迭代除了O(|B|)时间

不,它没有。Except在内部使用一个类似于HashSet<T>的集合实现。您可以查看Jon Skeet在Edulinq中提出的实现。将B中的所有元素放入HashSet<T>中,然后枚举a中的元素;如果它们不在HashSet中(检查这是一个0(1)操作),它们将在输出序列中返回。