2010-11-25 2 views
1

2つの文字列リストを表すIEnumerable<string>があります。私は、最初のセットの要素が2番目のセットの要素と一致するかどうかを確認したい。現時点では私はこのようなものがあります。最初のセットのアイテムが2番目のセットのアイテムと一致するかどうかを効率的に特定

firstSet.Intersect(secondSet).Count() > 0 

をしかし、それらすべてをカウントし、その後、一致する要素のリストを生成しますので、かなり非効率的であることが私には思えます。私はその後、カウントがゼロよりも大きいかどうかを調べるためにテストすることができます。私はどのマッチ、いくつのマッチ、2つのセットのどの要素がマッチしているかは気にしません。 firstSet.AnyMatch(secondSet)のようなものがありますか?

これをより効率的に表現する方法はありますか?

答えて

3

使用Any代わり:

if (firstSet.Intersect(secondSet).Any()) 

私はこれが(全体で)最初コレクションのハッシュセットを構築し、それが一致するものを見つけたりなくなるまで、第1セットを反復処理すると考えていますテストする要素の数。あなたはどの方向に回ってfirstSetsecondSetとするか決めるときにこれを念頭に置いておきたいかもしれません。

EDIT:ただコメントにすでに何繰り返す...あなたが(例えば)firstSetは、あなたがそれにキャストし、Overlapsを使用する必要がありますHashSet<string>であることがわかっている場合:

HashSet<string> firstHashSet = (HashSet<string>) firstSet; 
if (firstHashSet.Overlaps(secondSet)) 
{ 
    ... 
} 
+0

仮定する正しいだろう基になる型がHashSet で既に再構築されていないとしたら? –

+0

@Colin:最適化されているかどうかはわかりません。それらのうちの1つが 'HashSet 'であることを知っているなら、それをキャストして 'HashSet .Overlaps'を呼び出す必要があります。 –

+0

それは素晴らしいです。ありがとう。 –

関連する問題