web-dev-qa-db-ja.com

CountプロパティとCount()メソッド?

コレクションの操作オブジェクトの数を取得するには、2つの方法があります。 Count(プロパティ)とCount()メソッド。重要な違いは何ですか?私は間違っているかもしれませんが、Count()メソッドがコレクションに対して何らかのクエリを実行することを前提としているため、条件文でCountプロパティを常に使用します。しかし、それは推測です-私が間違っている場合、パフォーマンスが影響を受けるかどうかはわかりません。

編集:好奇心から、コレクションがnullの場合、Count()は例外をスローしますか?なぜなら、Countプロパティは単に0を返すだけだと確信しているからです。

71
user1017882

Count()拡張メソッドのソースを逆コンパイルすると、オブジェクトがICollection(ジェネリックまたはそれ以外)であるかどうかをテストし、そうであれば単純に基になるCountプロパティを返すことがわかります。

したがって、コードがCount()を呼び出す代わりにCountにアクセスする場合、型チェックをバイパスできます-理論的なパフォーマンス上の利点ですが、それが顕著なものになるとは思いません!

// System.Linq.Enumerable
public static int Count<TSource>(this IEnumerable<TSource> source)
{
    checked
    {
        if (source == null)
        {
            throw Error.ArgumentNull("source");
        }
        ICollection<TSource> collection = source as ICollection<TSource>;
        if (collection != null)
        {
            return collection.Count;
        }
        ICollection collection2 = source as ICollection;
        if (collection2 != null)
        {
            return collection2.Count;
        }
        int num = 0;
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                num++;
            }
        }
        return num;
    }
}
92
Ian Nelson

パフォーマンスは、どちらか一方を選択する1つの理由にすぎません。 .Count()を選択すると、コードがより汎用的になります。コレクションを生成しなくなったコードをリファクタリングする機会がありましたが、代わりにIEnumerableのようなより汎用的なものがありましたが、他のコードは_.Count_に依存していたため、.Count()に変更する必要があるため、結果として壊れました。どこでも.Count()を使用するように指定した場合、コードの再利用性と保守性が向上する可能性があります。通常は、より一般的なインターフェイスを使用できる場合は、それを使用することをお勧めします。より一般的には、より多くの型で実装されるシンプルなインターフェイスを意味するため、コード間の互換性が向上します。

.Count()の方が良いと言っているのではなく、あなたが書いているコードの再利用性をもっと扱う他の考慮事項があると言っているだけです。

29
AaronLS

.Count()メソッドmight十分にスマートであるか、または問題の型について知っていて、そうであれば、それmight基になる_.Count_プロパティを使用します。

再び、そうではないかもしれません。

コレクションに_.Count_プロパティ自体がある場合は、パフォーマンスに関して最善の策になると想定するのが安全だと思います。

.Count()メソッドがコレクションを知らない場合、それを列挙します。これはO(n)操作です。

Count()メソッドは、IEnumerable <>の各要素を反復処理し、要素の数を返す拡張メソッドです。 IEnumerableのインスタンスが実際にList <>である場合、すべての要素を繰り返すのではなく、Countプロパティを返すように最適化されています。

5
AntonioR

CountまたはLengthプロパティがある場合は、Count()メソッドよりも常に優先する必要があります。Count()メソッドは、通常、コレクション全体を繰り返して内部の要素の数をカウントします。 (Count()メソッドがLinq to SQLまたはLinq to Entitiesソースに対するものである場合は例外です。この場合、データソースに対してcountクエリを実行します。それでも、Countプロパティがある場合は、行う作業が少ない可能性が高いため、それを優先したい)

3
Dave C

Count()メソッドは、IEnumerable <>で機能するLINQメソッドです。 Count()メソッドがコレクション全体を反復してカウントを見つけると期待しますが、実際にはLINQコードには最適化があり、Countプロパティが存在するかどうかを検出し、使用する場合はそれを使用すると考えています。

したがって、両者はほぼ同じことを行う必要があります。型チェックを行う必要がないので、Countプロパティはおそらく若干優れています。

2
Dylan Smith

短いバージョン:CountプロパティとCount()メソッドのどちらかを選択できる場合は、常にプロパティを選択します。

違いは主に操作の効率性にあります。 Countプロパティを公開するすべてのBCLコレクションは、O(1)の形式でそれを行います。Count()メソッドは、O (N)。いくつかの実装では、O(1)に到達するためのいくつかのチェックがありますが、決して保証されません。

2
JaredPar

Count()はLINQの拡張メソッドとしてあります-CountLists(実際の.NETコレクションオブジェクト)のプロパティです。

そのため、Count()はコレクション/クエリ可能オブジェクトを列挙するため、ほとんど常に遅くなります。リスト、キュー、スタックなどでは、Countを使用します。または、配列の場合はLength

1