0

背景:数値のグループで数学計算を実行するのを支援するために、独自の「ベクトル」クラスを作成しようとしています。必要な機能を実現するために、算術演算子(+-* /)をオーバーロードしています。最初は、クラスでプライベート配列を使用してから、IEnumerable<T>インターフェイスを実装しました。その後、クラスを継承することを考えましList<T>たが、いくつかの記事を読んだ後、Collection<T>代わりに使用する必要があることを理解しました。「Vector」オブジェクトにデータを入力するときは、パフォーマンスが非常に重要であることに注意してください。

質問:この方法はどのように機能しCollection<T>.Add()ますか?List<T>.Add() ドキュメントは非常に明確です:

CountがすでにCapacityと等しい場合、リストの容量は内部配列を自動的に再割り当てすることによって増加し、新しい要素が追加される前に既存の要素が新しい配列にコピーされます。

ただし、Collection<T>.Add() ドキュメントには、その動作については何も記載されていません。基本クラスとして使用したときは、プロパティにList<T>アクセスでき、メソッドを使用する前にサイズを指定できました。ただし、プロパティがありません---これが私が質問している理由です。繰り返しますが、パフォーマンスは非常に重要です。CapacityAdd()Collection<T>Capacity

パフォーマンスが問題になるので、おそらくプライベート配列の使用とインターフェイスの実装に戻る必要がありIEnumerable<T>ます。どう思いますか?

4

2 に答える 2

4

ACollection<T>は のラッパーIList<T>です。のデフォルト コンストラクターはCollection<T>単に new を使用するList<T>ため、動作はデフォルト コンストラクターを使用すると仮定した場合Addと同じになります。List<T>

ただし、 Collection.Add() のドキュメントには、それがどのように機能するかについては何も書かれていません

これは、動作が、コンストラクターで渡される基にAddなる に依存しているためです。IList

ただし、 Collection には Capacity プロパティがありません

繰り返しますが、それはコレクションが何をラップしているかに依存するためです。インターフェイス をラップしますIList<T>。インターフェイスには容量の概念がありません。データベース内のレコードのように、既知の容量を持たないの実装が存在する可能性があります。IList<T>

容量などのこれらの実装の詳細が必要な場合は、List<T>. Collection<T>とにかく使用しているため、パフォーマンス上の利点はありませList<T>ん。パフォーマンスが重要な場合は、独自のライブラリを作成するのではなく、この問題を既に解決しているライブラリを見つけることをお勧めします。

于 2012-06-01T16:09:43.137 に答える
2

There is no details on implementation, but there is performance characteristics for Add in the documentation:

List<T>.Add

If Count is less than Capacity, this method is an O(1) operation. If the capacity needs to be increased to accommodate the new element, this method becomes an O(n) operation, where n is Count.

Collection<T>.Add (as of 2012-06-01)

This method is an O(1) operation.

Note that guarantee for Collection<T>.Add does not look right for at least collections created as wrapper on the List<T> or using default constructor of Collection which is implemented as Collection() : this(new List()) as @vcsjones pointed out. Looks like error in the documentation.

It should be easy to verify by measuring (which is the right way of solving performance questions) or sniffing at the sources...

Side note: You will not be able to beat List's Add performance with single array (as it is exactly what List does), you'll need to use something more complicated (like list of array chunks) to get O(1) from Add and Item[].

于 2012-06-01T16:22:27.053 に答える