为什么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))
这里每次迭代除了O(|B|)时间
不,它没有。Except
在内部使用一个类似于HashSet<T>
的集合实现。您可以查看Jon Skeet在Edulinq中提出的实现。将B
中的所有元素放入HashSet<T>
中,然后枚举a中的元素;如果它们不在HashSet
中(检查这是一个0(1)操作),它们将在输出序列中返回。