web-dev-qa-db-ja.com

List <T> AnyまたはCount?

リストで何かをしたいときは、最初にnullではないか、要素を含まないか(foreachを吹き飛ばさないように)確認します。通常はlist.Any()を使用しますが、最適なオプションは何ですか-_list.Count > 0_を使用するか、list.Any()を使用しますか?

53
Dominating
  • Countを使用している場合は、サイズがわかっているため、Listを使用します。
  • LengthにはArrayを使用します
  • IEnumerableがある場合は、.Any() over .Count()を使用します。これは、1つの項目をチェックした後に停止するため、高速になるためです。

また、この質問をチェックしてください: どのメソッドがより良いパフォーマンスを発揮します:.Any()vs .Count()> 0?

79
Ray

私が使う list.Count > 0 LINQメソッドに依存せず、C#2.0で機能するためです。

私は個人的にペストのようなLINQを避けています(速度が遅いため)、とにかくここで拡張メソッドを使用する理由はありません。

ただし、より良い解決策は、おそらく、ownAnyのバージョンを作成し、null参照を取得することです。要素を持つコレクションの場合はtrueを返します。これにより、nullチェックが節約されます。

4
Mehrdad

.Any()は、一般的に.Count() > 0よりも使用する方が適切です。この理由は、繰り返し処理しているアイテムがICollectionでない場合、リスト全体を繰り返してカウントを取得する必要があるためです。

ただし、アイテムがICollectionList<T>である)の場合、Count()を使用するのと同じくらい、または場合によっては高速です(Any()は1回反復します) MS .Netの基になる型に関係なく、Monoは基になる項目がICollectionである場合、Count > 0に最適化しようとします

優れたツールは Reflector 、. Netソースコード、および Monoソースコード です。これにより、どのように実装されているかを確認できます。

4
Lasse Espeholt

Entity Frameworkを使用していて、多くのレコードを持つ巨大なテーブルがある場合、Any()ははるかに高速になります。テーブルが空で何百万行もあるかどうかを確認したかったのを覚えています。 Count()> 0が完了するまでに20〜30秒かかりました。 Any()ですぐにできました。

2
ashlar64

Any()は、多くのものを取得するためにコレクションを反復する必要がないため、パフォーマンスを向上させることができます。それらの1つをヒットする必要があります。または、たとえば、LINQ-to-Entitiesの場合、生成されたSQLはSELECT COUNT ...またはSELECT * ...ではなくIF EXISTS(...)になります。

0
Janmejay Kumar