1

からオブジェクトにアクセスしたいとします。サイズを決定するためだけにCollection全体を反復処理しないようにしたいとします。Collection

Countへの呼び出しが実際にコレクションを反復するかどうかを判断および制御するにはどうすればよいですか? (私自身のICollection) の実装を使用する以外に、つまり、これを提供する実装はありますか?

public void PrintThreeNames(ICollection<string> names)
{
    //first I want to know if the collection has at least three elements.
    if (names != null && names.Count >= 3)
    {
        IEnumerator<string> enumerator = names.GetEnumerator();
        string value0 = enumerator.Current;
        enumerator.MoveNext();
        string value1 = enumerator.Current;
        enumerator.MoveNext();
        string value2 = enumerator.Current;
        //print values.
        Console.Writeline(value0 + value1 + value2);
    }
}

プログラマーのヒーローの質問に答えて。IEnumerable<T>コレクションに 100 万個のドキュメントを追加し、それを数えて への呼び出しの速度も確認できると思いCountます。

コレクションの数とアイテムごとのデータが非常に多いため、一度にすべてを返すのは問題になるため、IEnumerableoverを使用することを選択する可能性があるため、この質問をしました。Collection

IEnumarableただし、別の質問で、ジョシュアがロックするのは良い考えではないと指摘したことの欠点も知りたいです。

4

3 に答える 3

2

その実装Countは比較的高価ですか?おそらく、しかしそれらはまれでしょう。.NET Frameworkクラスは、全体的な効率がかなり高くなるように調整されています。

それは重要ですか?ほぼ間違いなくそうではありません。Count数百万の要素を含むコレクションに対して数百万回クエリを実行している場合を除いて、違いは非常に小さいため、関係ありません。

  • 100万個List<T>.Countの整数を含む1億回の呼び出し:0.85秒
  • 100万個HashSet<T>.Count()の整数を含む1億回の呼び出し:1.45秒
于 2011-05-03T14:12:41.733 に答える
1

ICollection は Count をプロパティとして公開するため、その値を取得するのは非常に安価であると想定しても安全です (つまり、コレクション全体を反復処理するべきではありません)。

これは、プロパティに関するベスト プラクティスにすぎません。値の取得は安価に行う必要があります。

操作に負荷がかかる場合は、Count() などのメソッドにする必要があります。

確かに、誰かが確かに ICollection.Count の高価な実装を提供できますが、その場合、その人は正しいことをしていません。

要素数の計算にコストがかかる場合は、ICollection ではなく、IEnumerable のみを実装する必要があります。

于 2011-05-03T13:44:29.963 に答える
0

技術的には、ICollection はインターフェイスであるため、コレクションを反復処理しないという保証はありません。インターフェースはとにかく実装できます。

于 2011-05-03T12:57:15.777 に答える