.NET List <T> ConcatとAddRange


回答:


122

それらは完全に異なるセマンティクスを持っています。

AddRangeは、他の項目を追加することによってリストを変更します。

Concatは、リストを変更せずに、リストと他のアイテムを含む新しいシーケンスを返します。

必要なセマンティクスを持つものを選択してください。


1
それで、タイトなループをイオン化して、GCの内部のすべての新しさとドキドキのためにパフォーマンスを失わないように、追加範囲を使用する方がはるかに良いでしょうか?
johnc 2008

43
実際、遅延実行のため、Concatを使用するとオブジェクトの割り当てが回避されるため、高速になる可能性があります-Concatは何もコピーせず、リスト間にリンクを作成するだけなので、列挙して最後に到達すると、透過的に最初に移動します次の!
グレッグビーチ、

36

大きな違いは、AddRangeが呼び出されたリストを変更するのに対して、Concatは新しいリストを作成することです。したがって、用途は異なります。

また、Concatは、任意のIEnumerableに適用され、新しいリストを生成するために.ToList()が必要なIEnumerableを返す拡張メソッドです。

既存のリストのコンテンツを拡張する場合は、AddRangeを使用します。

2つのIEnumerableソースから新しいリストを作成する場合は、.ToListでConcatを使用します。これは、どちらのソースも変更しないという品質を備えています。

2つのリスト(またはその他のIEnumerable)の内容を列挙するだけでよい場合は、毎回Concatを使用するだけで、統合リストを保持するために新しいメモリを実際に割り当てないという利点があります。


3
+1は、確かに、あなたは、連結は黙って何もしません「ToListメソッド」に忘れてしまった場合
smirkingman

7

これらの2つの構造の違いについて話し、パフォーマンスを比較するこの興味深い記事を見つけました...

主なアイデアは、大きなサイズのコレクションの場合、AddRangeの方がはるかに高速であるということです。

ここにリンクがあります

お役に立てれば、


1
私は1000の要素ConcatAddRange使って比較し、List<KeyValuePair<string, string>>100回連結/追加したテストを行いましたが、AddRange非常に高速でした。結果は、これらのは次の通りであった:AddRange13ミリ秒、Concat().ToList()16,000ミリ秒、およびConcatIEnumerableだけやってToList終わり:2700ミリ秒。
アンドリュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.