9

.Count()はLINQの拡張メソッドであり、基本的にはを使用していることを認識している.Countので、いつ使用する必要がCount()あり、いつ使用する必要があるの.Countでしょうか? .Count()まだ実行されていないため、まだ列挙がないクエリ可能なコレクションに対しては、主に保存する方が適切ですか? プロパティに対して常に拡張メソッドを使用する方が安全.Count()ですか、それともその逆ですか? それとも、これはコレクションによってのみ条件付きですか?

アドバイスや記事は大歓迎です。

更新 1

LINQ で拡張メソッドを逆コンパイルした後、プロパティがorの場合、プロパティ.Count()を使用しているように見えます。これは、ほとんどの回答が示唆しているものです。現在確認できる唯一の実際のオーバーヘッドは、追加の null と型のチェックです。これはそれほど大きくないと思いますが、パフォーマンスが最も重要な場合は、わずかな違いが生じる可能性があります。.Count IEnumerable<T>ICollection<T>ICollection

.Count().NET 4.0の逆コンパイルされた LINQ 拡張メソッドを次に示します。

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    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;
    checked
    {
        using (IEnumerator<TSource> enumerator = source.GetEnumerator())
        {
            while (enumerator.MoveNext())
            {
                num++;
            }
        }
        return num;
    }
}
4

6 に答える 6

10

拡張メソッドは任意で機能しますIEnumerable<T>が、反復してシーケンスをカウントするため、コストがかかります。ICollection<T>シーケンスがコレクションの長さがわかっていることを意味している場合、最適化があります。次に、Countプロパティが使用されますが、それは実装の詳細です。

最善のアドバイスはCount、パフォーマンス上の理由から、可能な場合はプロパティを使用することです。

.Count() は、まだ実行されていないため、まだ列挙されていないクエリ可能なコレクションに対して主に保存する方が適切ですか?

コレクションがそうでIQueryable<T>あり、そうでないIEnumerable<T>場合、クエリプロバイダーは効率的な方法でカウントを返すことができる場合があります。その場合、パフォーマンスが低下することはありませんが、クエリ プロバイダーによって異なります。

AnIQueryable<T>にはCountプロパティがないため、拡張メソッドとプロパティのどちらを使用するかを選択できません。ただし、クエリ プロバイダーが効率的な計算方法を提供しない場合は、コレクションをクライアント側にプルするためにCount()使用することを検討してください。.ToList()それは本当にあなたがそれをどのように使用するかによって異なります。

于 2012-05-18T12:41:20.260 に答える
1

のように、Count または Length プロパティを公開しないインターフェイスしかない場合は、Count() を使用する必要がありますIEnumerabe<T>

List<T>コレクションまたはコレクション インターフェイス (またはなど) を扱っている場合はICollection、単純に Count プロパティを使用できます。同様に、配列が Length プロパティを使用している場合も同様です。

Count() 拡張プロパティの実装は、基になるコレクションのCountプロパティが使用可能な場合はそれを使用します。それ以外の場合、コレクションはカウントを計算するために列挙されます。

于 2012-05-18T12:41:09.247 に答える
1

Count は、List (計算済み) からプロパティを取得します。Count() は、Sum()、Average() などの集計です。それが行うことは、列挙可能な項目をカウントすることです (列挙可能なものがリストの場合、内部で Count プロパティを使用すると思います)。

これは、単に Count プロパティを使用しない場合の Count() メソッドの具体的な使用例です。

var list = new List {1,2,3,4,5,6,7,8,9,10};

var count = list.Where(x => x > 5).Count();

また、Count() には、述語に一致するアイテムをカウントするオーバーロードがあります。

var count = list.Count(x => x > 5);
于 2012-05-18T12:46:03.580 に答える
1

利用可能かどうかのコメントに同意し.Countます (つまりICollection<T>、ボンネットの下に実装するオブジェクト)。

しかし、彼らは.Count()「高価」であることについて間違っています。 要素を列挙してカウントする前にEnumerable.Count()、オブジェクトが実装されているかどうかを確認します。ICollection<T>.Count

つまり、次のようなものです。

public int Enumerable.Count<TSource>(IEnumerable<TSource> source)
{
    var collection = source as ICollection
    if (collection != null)
    {
        return collection.Count;
    }
}
于 2012-05-18T12:46:34.593 に答える
0

Count() はおそらく Count プロパティを読み取るだけなので、それが重要かどうかはわかりません。パフォーマンスの違いはごくわずかです。好きな方を使ってください。一貫性を保つために、可能な場合は Count() を使用します。

于 2012-05-18T12:45:02.237 に答える
0

他の人が言ったように、 がある場合はICollection<T>、Count プロパティを使用します。

このメソッドは、列挙の要素でやりたいことだけがそれらを数えることだけIEnumerable.Count()である場合に使用することを実際に意図していることをお勧めします。SQL の「SELECT COUNT(...」に相当します。

さらに、列挙型の要素で何か他のことをしたい場合は、コレクション (通常は を使用したリストToList()) を生成する方が理にかなっています。その後、Count プロパティを使用して、やりたいことを何でも行うことができます。

于 2012-05-18T13:07:57.140 に答える