IEnumerable
について.ToList()
を実行すると、サイズが先行することがわからないため、リストはIEnumerable
をスキャン中に潜在的に再割り当てされる可能性があります。サイズが分かっている場合は、パフォーマンス上の不利益を回避する簡単な方法はありますか? List
を必要な容量で初期化してからIEnumerable
をコピーすると何か問題が発生しますか?理想的には、.ToList(capacity)
(これは存在しません)という単純なものです。容量をリストするには?
1
A
答えて
3
容量がIEnumerable<T>
の一部であり、それがICollection<T>
でもある場合、ライブラリは正しい容量で割り当てます。ここで
あなたはToList()
を呼び出すときに呼び出されるreference implementation of List<T>(IEnumerable<T> source)
、次のとおりです。
public List(IEnumerable<T> collection) {
if (collection==null)
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.collection);
Contract.EndContractBlock();
ICollection<T> c = collection as ICollection<T>;
if(c != null) {
int count = c.Count;
if (count == 0) {
_items = _emptyArray;
} else {
_items = new T[count];
c.CopyTo(_items, 0);
_size = count;
}
} else {
_size = 0;
_items = _emptyArray;
// This enumerable could be empty. Let Add allocate a new array, if needed.
// Note it will also go to _defaultCapacity first, not 1, then 2, etc.
using(IEnumerator<T> en = collection.GetEnumerator()) {
while(en.MoveNext()) {
Add(en.Current);
}
}
}
}
注collection
がICollection<T>
を実装したときに、コンストラクタがどのように動作するか:むしろ内容を反復し、各項目のAdd
を呼ぶよりも、それは内部を割り当て_items
配列を作成し、再割り当てなしでコンテンツをコピーします。
IEnumerable<T>
を実装したクラスに埋め込まれ
ないあるとき、あなたは簡単に標準的な方法の組み合わせを使用して、1を自分で定義することができる状況では
:
static class ToListExtension {
public static List<T> ToList(this IEnumerable<T> source, int capacity) {
var res = new List<T>(capacity);
res.AddRange(source);
return res;
}
}
関連する問題
- 1. 大容量の大容量ファイル
- 2. テストサーバーの容量
- 3. コモンズコレクションバッファ容量
- 4. 「大容量cnn」または「高容量アーキテクチャ」の定義は何ですか?
- 5. どのようにusb otgの空き容量/総容量を取得するには?
- 6. Railsは大容量のファイル
- 7. ディスク容量に関するスクリプト
- 8. Android SDKは大量のディスク容量を必要とします
- 9. LocalForageのストレージ容量
- 10. qgis netlogoインターフェイス容量
- 11. EC2スポットインスタンス容量プール
- 12. SlideToggle div内容量
- 13. スウィフトコアのデータ容量
- 14. C#のスタック容量
- 15. グローバルEhCache容量を指定する
- 16. ディスク容量を確認するDjangoアプリ
- 17. cmdバッチファイルによる空きディスク容量
- 18. プレイでシステム容量をキャッシュ
- 19. カフカクラスタv0.8.1.1のディスク容量の合計と使用可能容量は?
- 20. Redisのメモリ使用量とバックアップによる空き容量
- 21. WP7の空き容量を知る
- 22. Chromeの保存容量と保存容量を取得できない
- 23. コンピュータの総RAM容量を知るには?
- 24. android/iosで利用可能なディスク容量を知るには?
- 25. ディレクトリやパーティションのディレクトリの容量を調べるには
- 26. Google App Engine大容量ファイルアップロード
- 27. MSSQL SERVER 2005データベーステーブル容量
- 28. okhttp3大容量ファイルのOutOfMemoryError
- 29. 最大SharePointコンテンツDB容量
- 30. Linuxサーバーのディスク容量
を 'ToList'がちょうど'一覧(IEnumerableをを呼び出します) 'コンストラクタで、ソースが' ICollection 'を実装しているかどうかをチェックし、カウントを使用して容量を設定します。 –
Lee