回答:
それらは完全に異なるセマンティクスを持っています。
AddRangeは、他の項目を追加することによってリストを変更します。
Concatは、リストを変更せずに、リストと他のアイテムを含む新しいシーケンスを返します。
必要なセマンティクスを持つものを選択してください。
大きな違いは、AddRangeが呼び出されたリストを変更するのに対して、Concatは新しいリストを作成することです。したがって、用途は異なります。
また、Concatは、任意のIEnumerableに適用され、新しいリストを生成するために.ToList()が必要なIEnumerableを返す拡張メソッドです。
既存のリストのコンテンツを拡張する場合は、AddRangeを使用します。
2つのIEnumerableソースから新しいリストを作成する場合は、.ToListでConcatを使用します。これは、どちらのソースも変更しないという品質を備えています。
2つのリスト(またはその他のIEnumerable)の内容を列挙するだけでよい場合は、毎回Concatを使用するだけで、統合リストを保持するために新しいメモリを実際に割り当てないという利点があります。
これらの2つの構造の違いについて話し、パフォーマンスを比較するこの興味深い記事を見つけました...
主なアイデアは、大きなサイズのコレクションの場合、AddRangeの方がはるかに高速であるということです。
ここにリンクがあります
お役に立てれば、
Concat
をAddRange
使って比較し、List<KeyValuePair<string, string>>
100回連結/追加したテストを行いましたが、AddRange
非常に高速でした。結果は、これらのは次の通りであった:AddRange
13ミリ秒、Concat().ToList()
16,000ミリ秒、およびConcat
上IEnumerable
だけやってToList
終わり:2700ミリ秒。