2012-04-13 10 views
11

私はしばしばこのようなコードを記述します。カウントとキャパシティの速さはどれくらいですか?

if (list.Count > 0) { } 

これは効率的ですか?

  • 反復リストを通って、
  • 結果、その要素を数える:のように、この操作を見てはい986000の要素
  • は0より大きく986000ですか?

またはこのような真のリターン:

  • リストの要素の保存数(986000)
  • を取得するには、0より大きい986000ですか?
  • 、リスト内の要素の数を取得するには、あるリストを介してすべての道をカウントしなければならないのか、要素の数がどこかに記録されている

  • 復帰?これはすべてのICollectionクラスのケースですか?

    リストのCapacityはどうなりますか?

  • 答えて

    33

    私はしばしばこのようなコードを書いています:if (list.Count > 0) { }これは効率的ですか?

    はい。これは、リスト内のフィールドに格納されているリスト内のカウントを取得し、ゼロと比較します。

    今の質問は、あなたが要求していない:

    を何if (sequence.Count() > 0) { }については? (Count()の括弧に注意してください。)

    我々は、それが効率的に計算することができるCountプロパティを持つリストであるかどうかを確認するために、実行時にシーケンスを調べます。そうであれば、それを呼ぶ。そうでない場合は、シーケンス全体を1項目ずつカウントし、それをゼロと比較します。

    それほど効率的ではありませんか?

    はい。

    もっと効率的でしょうか?

    if (sequence.Any())

    なぜ、より効率的ということでしょうか?

    の1つを要素で反復しようとします。成功すると、Anyがtrueになります。失敗した場合、Anyはfalseです。あなたは、ゼロ以上があるかどうかを知るために、瓶の中のゼリービーンの数を数える必要はありません。あなたは、少なくとも1つがあるかどうかを調べる必要があります。

    コードはかなり効率的であることに加えて、コードの意図された意味のように読み取られるようになりました。あなたが "リストに項目がありますか?" 「リストには何かありますか? 「リスト内のアイテムの数がゼロよりも多い」ではない

    リストのCapacityプロパティについてはどうなりますか?

    これは、リストの内部データ構造にどれくらいのスペースがあらかじめ割り当てられているかを示します。これは、リストに格納できるアイテムの量で、より多くのメモリーを割り当てる必要があります。

    +0

    "実行時にシーケンスを調べて、効率的に計算できるCountプロパティを持つリストであるかどうかを確認します。それはどういう意味ですか? 'Count'というプロパティをチェックしますか、' ICollection 'が実装されているかどうかチェックしますか?もしもあなたが 'IEnumerable 'の共分散を使うなら、2番目のものは面白い特別な場合があります。 – CodesInChaos

    +0

    @CodeInChaos:Countという名前のプロパティのReflection経由で見ると、速度が遅く、信頼性が低くなります。私たちはインタフェースの実装を探します。そして、はい、あなたは共分散問題の結果として偽陰性を得ることができます。もしあなたがそれをするときに痛いなら、それをしないでください。 –

    +2

    @CodeInChaos 'ICollection 'のチェックが失敗すると、コードは非汎用ICollectionをチェックします。したがって、ほとんどのフレームワークコレクションは共分散問題から安全です。 – phoog

    2

    list.Any()の代わりにこのコードを使用してください。それはList<>.Countより遅いかもしれませんが、最も効率的な方法で任意のIEnumerable <>で動作します。

    Capacityは、Countよりgreatedすることができます。後でたくさんのアイテムを追加する予定がある場合に使用されます。 List.Countの

    Imlementation次は(それは本当にO(1)である)である:

    public int Count 
    { 
        get 
        { 
        return this._size; // this is a field 
        } 
    } 
    
    +2

    '.Any()は' .Count()> 0'よりも優れていますが、コレクションに列挙子を作成するため、少し効率が悪いです。 – Gabe

    +0

    fotリストまたはcを格納しているコレクション –

    2

    Countはリスト上のO(1)操作です。

    これは最速の方法です。

    カウント:これは実際にリストに存在する要素の数です。

    Capcityは:

    サイズ変更せずに保持することができる 要素の総数内部データ構造を取得または設定:より良いドキュメントが説明します。

    1

    容量では、リストに含まれているオブジェクトの数は表示されません。 MSDNから

    Capacity is the number of elements that the List<T> can store before resizing is required, while Count is the number of elements that are actually in the List<T>. 
    

    List.Countは超高速であり、List.Count(一方アクセスプロパティですが)のIEnumerableからだと私はリストを完全な列挙を行うことがあると考えています。

    6

    プロパティーは、OCL(1)操作であり、リスト内の要素数の数に無関係で高速であることを意味します。

    IEnumerable<T>で呼び出すことができる拡張方法Count()もあります。このメソッドはO(n)です。つまり、ランタイムは列挙可能な要素の数に依存します。ただし、1つの例外があります。列挙型が実際にICollection<T>またはICollectionの実装である場合は、Countプロパティを使用して、再びO(1)操作にします。


    通常、このプロパティは気にする必要はありません。

    +1

    オペラが約986,000の要素をリストアップしていることを考慮すると、適切な場所でキャパシティを巧みに管理*することで大きな利益を得ることができます。 – Tigran

    +0

    容量はヒットするたびに倍増するため、容量を管理するだけで多くのリストを埋める場合には本当のメリットがもたらされます。 –

    +0

    それは私が意味するものではありません:それはいくつかの状況で利益をもたらすことができます(例CADプログラム) – Tigran

    関連する問題