11

私はよく次のようなコードを書きます。

if ( list.Count > 0 ) { }

これは効率的ですか?この操作は次のようになりますか。

  • リストを反復処理し、その要素を数えます
  • 結果: 986,000 要素
  • 986,000 は 0 より大きいですか?
  • 真を返す

またはこのように:

  • リストに格納されている要素数を取得する (986,000)
  • 986,000 は 0 より大きいですか?
  • 真を返す

つまり、リスト内の要素の数を取得するには、リスト全体を数えなければなりませんか、それとも要素の数はどこかに記録されていますか? そして、これはすべてのICollectionクラスに当てはまりますか?

Capacityリストのはどうですか?

4

5 に答える 5

33

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

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

ここで、あなたが尋ねなかった質問:

どう if ( sequence.Count() > 0 ) { }ですか?( の括弧に注意してくださいCount()。)

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

それは非常に非効率的ではありませんか?

はい。

より効率的なものは何ですか?

if (sequence.Any())

なぜそれがより効率的なのですか?

1 つの要素を繰り返し処理しようとするためです。成功した場合Anyは真です。失敗した場合Anyは false です。瓶の中のジェリービーンズの数を数える必要はありません。少なくとも 1 つあるかどうかを確認するだけで済みます。

大幅に効率化されただけでなく、コードが意図したとおりに読み取れるようになりました。「リストにアイテムはありますか?」と尋ねたい場合 次に、「リストに項目はありますか?」と尋ねます。「リスト内のアイテムの数はゼロより大きいですか?」ではありません。

Capacityリストのプロパティはどうですか?

これは、リストの内部データ構造に事前に割り当てられたスペースの量を示しています。これは、追加のメモリを割り当てる前にリストが格納できるアイテムの量です。

于 2012-04-13T14:44:30.403 に答える
6

Countプロパティ (List<T>および BCL の他のすべてのICollection<T>実装) は O(1) 操作です。つまり、リスト内の要素の数に関係なく高速であるということです。

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


プロパティは通常、Capacity心配する必要はありません。

于 2012-04-13T14:40:12.593 に答える
2

代わりに次のコードを使用してください: list.Any(). よりも遅くなる可能性がありますがList<>.Count、最も効率的な方法で IEnumerable<> に対して機能します。

Capacityよりも大きくすることができますCount。後でたくさんのアイテムを追加する予定がある場合に使用します。

List.Count の実装は次のとおりです (実際には O(1) です)。

public int Count
{
  get
  {
    return this._size; // this is a field
  }
}
于 2012-04-13T14:37:44.417 に答える
2

Count はO(1)List に対する操作です。

最速の方法です。

Count : リストに実際に存在する要素の数です。

Capcity : より良いドキュメントについて説明します:

内部データ構造がサイズ変更せずに保持できる要素の総数を取得または設定します。

于 2012-04-13T14:39:47.697 に答える
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 のものであり、リストを介して完全な列挙を行う必要があると思います。

于 2012-04-13T14:39:58.307 に答える