我应该在Linq中处理HashSet时使用Except或Contains

时间:2011-08-26 23:04:10

标签: c# linq

看看这个:

 var query = myDic.Select(x => x.Key).Except(myHashSet);

 var query = myDic.Select(x => x.Key).where(y=>!myHashSet.Contains(y))

我想在第一种情况下由于多态性将调用Contains的O(1)版本。 但不知道except

更新

在我的情况下,Exept也是O(1)。

why linq's `except` extension method does not have Except<TSource> Method (IEnumerable<TSource>,HashSet<TSource>) overload?

2 个答案:

答案 0 :(得分:0)

  

var query = myDic.Select(x =&gt; x.Key).Except(myHashSet);

Except将是IEnumerable的扩展名(Select的结果)。这是 O(1)

  

myHashSet.Contains(y)的   确实在调用成员函数,即O(n)


考虑

new HashSet<K>(myDic.Select(x => x.Key)).ExceptWith(myHashSet);

另请参阅HashSet&lt;&gt; .SymmetricExceptWith()

答案 1 :(得分:0)

如果您的myDic是普通的.NET词典,那么我会选择

myDic.Keys.Except(myHashSet)

以提高可读性。

要说出您的选择,第一个是O(n + m),而第二个是O(n),这两个都不能告诉您哪个集合最先完成。如有疑问,两匹马都要比赛。

@sehe的答案也是O(n + m),但很可能比您的O(n + m)解决方案要快。