3

Entity Framework を使用してアイテムのリストを取得しています。取得したアイテムがある場合は、それらに対して何かを行います。

var items = db.MyTable.Where(t => t.Expiration < DateTime.Now).ToList();
if(items.Count != 0)
{
    // Do something... 
}

このifステートメントは、次のように書くこともできます。

if(items.Count() != 0)
{
    // Do something... 
}

最初のケースでは、.CountList<T>.Countプロパティです。2 番目のケースでは、.Count()拡張IEnumerable<T>.Count()メソッドです。

どちらのアプローチでも同じ結果が得られますが、どちらがより好ましいのでしょうか? (もしかしたら性能差?)

4

3 に答える 3

9

Enumerable.Count<T>( の拡張メソッド)は、基になる型が の場合にIEnumerable<T>呼び出すだけなので、違いはありません。CountICollection<T>List<T>

Queryable.Count<T>( の拡張メソッドIQueryable<T>) は、基礎となるクエリ プロバイダーを使用します。これにより、多くの場合、カウントが実際の SQL にプッシュされ、メモリ内のオブジェクトをカウントするよりも高速に実行されます。

フィルタが適用されている場合 (例: Count(i => i.Name = "John"))、または基になる型が でない場合ICollection<T>、コレクションは列挙されてカウントが計算されます。

どちらが優先されますか?

私は通常Count()、1) より移植性が高く (基になる型はIEnumerable<T>orを実装するものであれば何でもかまいませんIQueryable<T>)、2) 必要に応じて後でフィルターを追加するのが簡単であるため、使用することを好みます。

ティムがコメントで述べているように、実際にアイテムをカウントする必要がないため、私も を使用Any()することを好みます。1 つのアイテムの存在をチェックするだけです。Count() > 0逆に!Any()の代わりに使用しCount() == 0ます。

于 2013-08-12T21:19:09.057 に答える
1

ifブロック内で何が起こっているかによると思います。基礎となる列挙に対して一連の操作を実行するかどうかを判断するためにチェックを行っているだけの場合は、おそらくどのイベントでも必要ありません。列挙を繰り返すだけです(同様に省略ToListします)。ブロック内でコレクションを使用していない場合は、if使用を避け、どのメソッドよりもToList確実に使用する必要があります。AnyCount/Count()

を実行するToListと、Entity Framework を使用しなくなります。基になるコレクションがその実装に従う場合、それはそれ以降Count()よりもわずかに遅くなると思います。唯一のオーバーヘッドは、そのインターフェイスを実装するかどうかを決定することです。CountICollection<T>

http://msdn.microsoft.com/en-us/library/bb338038.aspx

備考: ソースの型が を実装している場合ICollection<T>、その実装を使用して要素の数を取得します。それ以外の場合、このメソッドはカウントを決定します。

于 2013-08-12T21:44:16.683 に答える