web-dev-qa-db-ja.com

リスト:Count vs Count()

リストが与えられた場合、内部の要素の数を決定するのにどの方法が好ましいでしょうか?

var myList = new List<string>();

myList.Count
myList.Count()
95
Saxman

Count()はLINQによって導入された拡張メソッドですが、CountプロパティはList自体の一部です(ICollectionから派生)。内部的には、LINQはIEnumerableICollectionを実装しているかどうかを確認し、実装している場合はCountプロパティを使用します。したがって、1日の終わりに、Listにどちらを使用しても違いはありません。

私のポイントをさらに証明するために、ここにEnumerable.Count()のReflectorのコードを示します。

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        throw Error.ArgumentNull("source");
    }
    ICollection<TSource> is2 = source as ICollection<TSource>;
    if (is2 != null)
    {
        return is2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num++;
        }
    }
    return num;
}
118
BFree

型の拡張メソッドCount()よりも、常にCountおよびLengthプロパティを優先します。前者は、それらを含むすべてのタイプのO(1)です。 Count()拡張メソッドには、O(1)時間でも実行できるタイプチェックの最適化がありますが、基になるコレクションがO(N)に低下します。知っている数少ないタイプの1つではありません。

23
JaredPar

myList.Countはリストオブジェクトのメソッドであり、フィールドの値を返すだけなので非常に高速です。これは小さな方法であるため、コンパイラ(またはランタイム)によってインライン化される可能性が非常に高いため、コンパイラによって他の最適化が可能になる場合があります。

myList.Count()は、IEnumerabl内のすべてのアイテムをループする拡張メソッド(LINQによって導入された)を呼び出しているため、非常に遅くなります。

ただし(Microsoftの実装では)Count拡張メソッドにはリストの「特殊なケース」があり、リストのCountプロパティを使用できます。つまり、Count()メソッドはCountプロパティよりも少し遅いだけです。

たいていの場合、ほとんどのアプリケーションで速度の違いを知ることができるでしょう。

Listを扱っていることがわかっている場合はCountプロパティを使用し、そうでない場合は「不明な」IEnumerablがある場合は、Count()メソッドを使用して最適化してください。

10
Ian Ringrose

万が一コレクションのタイプを変更したい場合は、Count()拡張を使用することをお勧めします。この方法では、コードをリファクタリングする必要がありません(たとえば、Lengthを使用するため)。

7
Simon Fischer