7

hsHashSetが空であるかどうかを知りたいだけです。含まれる要素の数を正確に知ることには興味がありません。

だから私はこれを使うことができます:

bool isEmpty = (hs.Count == 0);

...またはこれ:

bool isEmpty = hs.Any(x=>true);

パフォーマンス面で (特に HashSet に多数の要素が含まれている場合)、どちらがより良い結果を提供しますか?

4

3 に答える 3

3

HastSet<T>ICollection<T>これにはCountプロパティがあるため、 への呼び出しはCount()単に を呼び出しますHastSet<T>.Count。これは O(1) 操作であると想定しています (つまり、実際にはカウントする必要はありません- の現在のサイズを返すだけですHashSet)。

Any条件に一致するアイテムが見つかるまで繰り返し、その後停止します。

したがって、あなたの場合、1つのアイテムを反復して停止するだけなので、違いはおそらく無視できます。

適用したいフィルタx => x.IsValid(例: )Anyがある場合は、コレクション全体を反復処理するため、確実に高速になりますが、一致が見つかるとすぐに停止します。Count(x => x.IsValid)Any

これらの理由から、より直接的であり、潜在的なパフォーマンスの問題を回避できるため、私は一般的に を使用することを好みAny()ますCount()==0。よりもパフォーマンスが大幅にCount()==0向上した場合にのみ、に切り替えます。Any()

Any(x=>true)を呼び出すことと論理的に同じであることに注意してくださいAny()。それはあなたの質問を変えるものではありませんが、ラムダがなければきれいに見えます。

于 2013-08-14T15:19:06.250 に答える