19

重複の可能性:
コレクション内のカウント vs 長さ vs サイズ
Array.Length vs Array.Count

この配列を宣言しました:

int[] misInts = new Int[someNumber];

/* make some happy operations with the elements in misInts */

したがって、次のように SomeNumber の値を取得できます: misInts.Length または misInts.Count()

C# の配列は IEnumerable から継承します。だから私が持っている場合:

Func<int> misIntsF = Enumerable.Range(0, someNumber).Select(c=> /* make some happy operations that return Integers */);

misIntsF.Count() を作成すると、Lambda 式で実際にコードを実行し、結果を取得してカウントすると言われました。しかし、配列 misInts にはラムダ式がありません。

misInts.Count() は、misInts.Length よりも多くのメモリを消費しますか? misInts.Count() と misInts.Length の違いは何ですか?

4

2 に答える 2

28

array.Count()Enumerable.Count<T>(IEnumerable<T>)実際には拡張メソッドの呼び出しです。

このメソッドは(プロパティを持つ とはIEnumerable<T>対照的に) を受け取るため、シーケンス全体をループして、その大きさを把握する必要があります。ICollection<T>Count

ただし、実際には、パラメーターが実装されているかどうかICollection<T>(どの配列が実装しているか) をチェックし、実装している場合はCount直接返します。
したがって、配列の呼び出し.Count()は より遅くはありません.Lengthが、追加の型キャストが必要になります。

于 2012-12-03T14:43:30.927 に答える
10

Enumerable.Countにキャスト可能な場合は最初に見える ので、大きな違いはありませんICollection<T>

MSDN:

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

ソース:

ICollection<TSource> collection = source as ICollection<TSource>;
if (collection != null)
{
    return collection.Count;
}

それ以外の場合は、シーケンスを列挙してカウントします。

int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        num++;
    }
}
return num;

(出典: ILSpy )

于 2012-12-03T14:43:53.020 に答える