IEnumerable<T>
があります。コピーが必要です。 IEnumerable<T>
を実装するものであれば問題ありません。それをコピーする最も安い方法は何ですか? .ToArray()
かもしれませんか?IEnumerableをコピーする最も安価な方法<T>?
答えて
は必ずしもToList
より速いわけではありません。ちょうどToList
を使用してください。
列挙する前の元の配列の要素の数が分からない限り、配列のサイズを変更し、List<T>
のように要素を追加することになります。ToArray
は、とにかくList<T>
と同じことがあります。さらに、ToList
はList<T>
を返します。これは生の配列よりも優れています。
もちろん、IEnumerable<T>
インスタンスの具体的なタイプが分かっている場合は、より高速な方法があるかもしれませんが、それはその点に密接な関係はありません。
サイドノート:配列を使用する必要がない限り、おそらくマイクロ最適化であり、avoidedmost of the timeである必要があります。
2番目に安価な方法は、new List<T>(myEnumerable).ToArray()
と言います。一番安い方法は、.ToArray()
(LINQから)、またはC#3.5を使用していない場合は独自のバッファを作成してサイズを倍増させながら追加し、最後にトリムします。
Enumerable::ToArray
とEnumerable::ToList
最終的に内部配列バッファにソースから要素を受信するために、同じ技術を使用して、そのバッファのサイズに達すると、それらは、サイズを2倍、新しいバッファを割り当てるのmemcpy上加算続けますソース上の列挙が完了するまでこのプロセスを繰り返します。最終的な違いは、内部でBuffer<T>
の実装を使用するToArray
が正確にサイズがArray
に割り当てられ、結果を返す前に要素をコピーする必要があることです。一方、ToList
は、部分的に満たされている可能性がある(おそらく)配列バッファを内部に持つList<T>
を返すだけで済みます。
どちらの実装もソースIEnumerable
がICollection
であれば、彼らは実際に自分のバッファを埋めるために、ソースからICollection::CopyTo
を使用し、その後ICollection::Count
を使用して開始するために、正確な右のバッファサイズを割り当てます最適化を持っています。
最終的にほとんどの状況でほぼ同じように動作しますが、List<T>
は技術的には「重い」クラスであり、最終的にはの最後に+ memcpyが割り当てられますソースはICollection
ではありません)、正確に正しいサイズの配列を返すことができます。私はたぶんTask::WaitAll
のような配列を必要とする何かに結果を渡す必要があることを知っていない限り、通常ToList
と固執します。
私はこれがかなり古いことを知っています...
なぜあなたはこのようなことをすることができませんでしたか?
IEnumerable <T> original = {...挿入するコードをここに挿入...};
IEnumerable <T> copy =(元の選択行の行から)。
実際に必要となるまでコピーとその要素の読み込みを延期する前にこのメソッドを使用していましたが、 "オリジナル"のデータ型をリスト型にキャストしていません。
アイデンティティセレクトでは実際にあなたに何も与えていません。これは、実行時に余分なオーバーヘッドを追加し、潜在的な型にキャストするのを防ぐ以外は、他の 'IEnumerable'への参照をコピーすることと実際には機能的に異なるわけではありません。 'ToList'のある時点でシーケンスがどのように見えるかのスナップショットが必要な場合は、正しい方法です。そうでない場合、他のシーケンスと同じマナーで生成されたシーケンスが必要な場合は、参照自体をコピーしてください。もっと何もする必要はありません。 – Servy
- 1. 単一のオブジェクトを作る最も安価な方法Enumerable?
- 2. ASP.Net MVCアプリケーションを展開する最も安価な方法は何ですか?
- 3. FileStreamはFile.Copyをコピーする最も安全な方法ですか?
- 4. 10mのエンティティからアプリケーションエンジンにインポートする最も安価な方法
- 5. Linqのディクショナリ<int、Dictionary <int, Foo>>をIEnumerable <IEnumerable <Foo>>に変換する最も簡単な方法は?
- 6. IEnumerableのカウントを取得する最善の方法<T>
- 7. テーブルの行IDを参照する最も安全な方法
- 8. 最も安全な方法は、PHPでセッションを作成する
- 9. インターネット経由でビデオをストリーミングする最も安全な方法
- 10. GCDでファイルをコピーする最も効率的な方法は?
- 11. intをbyte []にコピーする最も簡単な方法
- 12. リストから選択する方法<IEnumerable <ItemClass>>〜IEnumerable <ItemClass>?
- 13. C++:ブーストをキャストするもっとも安全な方法::オプション<type>
- 14. データベースに接続する最も安全な方法
- 15. 最初のIEnumerableアイテムを別の方法で処理する最もエレガントな方法
- 16. IEnumerable <T>評価時間の測定方法はありますか?
- 17. ビットマップをハッシュするための安価な方法ですか?
- 18. 最も安全なハッシュ方法は何ですか? (PHP)
- 19. スレッドセーフなシングルトンパターンを実装する最も安全な方法は何ですか?
- 20. 友人関係をモデリングする安価な方法
- 21. I/Oを改善するための安価な方法
- 22. IEnumerable <T>に1つのアイテムを追加する最も良い方法は何ですか?
- 23. オブジェクトを共有する最も安全な方法は何ですか?PHP
- 24. Webサービス/ APIを実装する最も安全な方法は何ですか?
- 25. HashSetを反復する最も速く/最も安全な方法は何ですか?
- 26. ファイルからHttpServletResponseにテキストをコピーする最も速い方法
- 27. リモートXMLのコピーを取得する最も良い方法は?
- 28. プロジェクト内の変数名を変更する最も安全な方法
- 29. VB.NetでSQL接続文字列を使用する最も安全な方法
- 30. PHPでデータベースに接続する最も安全な方法は何ですか?
これらは事実上同等です。 – Vadim
@ヤード:正確に。 –
+1。実際、Monoの[Enumerable.ToArray'](https://github.com/mono/mono/blob/master/mcs/class/System.Core/System.Linq/Enumerable.cs#L2794)では 'new List 'IEnumerable'が 'ICollection 'でなければ、(ソース).ToArray() 'が返されます。 MSのものが似ていれば私は驚かないだろう。 –