リストで何かをしたいときは、最初にnull
ではないか、要素を含まないか(foreach
を吹き飛ばさないように)確認します。通常はlist.Any()
を使用しますが、最適なオプションは何ですか-_list.Count > 0
_を使用するか、list.Any()
を使用しますか?
Count
を使用している場合は、サイズがわかっているため、List
を使用します。Length
にはArray
を使用しますIEnumerable
がある場合は、.Any()
over .Count()
を使用します。これは、1つの項目をチェックした後に停止するため、高速になるためです。また、この質問をチェックしてください: どのメソッドがより良いパフォーマンスを発揮します:.Any()vs .Count()> 0?
私が使う list.Count > 0
LINQメソッドに依存せず、C#2.0で機能するためです。
私は個人的にペストのようなLINQを避けています(速度が遅いため)、とにかくここで拡張メソッドを使用する理由はありません。
ただし、より良い解決策は、おそらく、ownAny
のバージョンを作成し、null
参照を取得することです。要素を持つコレクションの場合はtrueを返します。これにより、nullチェックが節約されます。
.Any()
は、一般的に.Count() > 0
よりも使用する方が適切です。この理由は、繰り返し処理しているアイテムがICollection
でない場合、リスト全体を繰り返してカウントを取得する必要があるためです。
ただし、アイテムがICollection
(List<T>
である)の場合、Count()
を使用するのと同じくらい、または場合によっては高速です(Any()
は1回反復します) MS .Netの基になる型に関係なく、Monoは基になる項目がICollection
である場合、Count > 0
に最適化しようとします
優れたツールは Reflector 、. Netソースコード、および Monoソースコード です。これにより、どのように実装されているかを確認できます。
Entity Frameworkを使用していて、多くのレコードを持つ巨大なテーブルがある場合、Any()ははるかに高速になります。テーブルが空で何百万行もあるかどうかを確認したかったのを覚えています。 Count()> 0が完了するまでに20〜30秒かかりました。 Any()ですぐにできました。
Any()は、多くのものを取得するためにコレクションを反復する必要がないため、パフォーマンスを向上させることができます。それらの1つをヒットする必要があります。または、たとえば、LINQ-to-Entitiesの場合、生成されたSQLはSELECT COUNT ...またはSELECT * ...ではなくIF EXISTS(...)になります。