サンプルコードは次のとおりです。
IList<MyType> myList1=new List<MyType>();
IList<MyType> myList2=new List<MyType>();
// Populate myList1
...
// Add contents of myList1 to myList2
myList2.Add(myList1); // Does not compile
あるリストの内容を別のリストに追加するにはどうすればよいですか?これを行う方法はありますか?
これを行うための優れた組み込みの方法はありません。本当に必要なのはAddRange
メソッドですが、IList<T>
(またはその階層)には存在しません。新しい拡張メソッドの定義は簡単ですが、
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable) {
foreach (var cur in enumerable) {
collection.Add(cur);
}
}
myList2.AddRange(myList1);
両方のリストタイプをList
ではなく具象IList
として宣言する場合は、AddRange
メソッドを使用できます。
List<MyType> myList1=new List<MyType>();
List<MyType> myList2=new List<MyType>();
myList2.AddRange(myList1);
それ以外の場合は、LINQを使用して2つを組み合わせることができます。
using System.Linq;
IList<MyType> myList1=new List<MyType>();
IList<MyType> myList2=new List<MyType>();
var newList = myList1.Concat(myList2);
Enumerablr拡張機能を使用します。
myList2=new List<MyType>(myList2.Concat(myList1))
ところで、myList2を設定しない場合は、myLis1に基づいて作成できます。
[〜#〜]編集[〜#〜]
私はいくつかのケースのパフォーマンスを調査しようとしました
1)Addを介したAddRange
List2.AddRange(List1);
public static class AddRangeUtils
{
public static void AddRange<T>(this ICollection<T> collection, IEnumerable<T> enumerable)
{
foreach (var cur in enumerable)
{
collection.Add(cur);
}
}
}
2)連結
List2 = new List<TestClass>(List2.Concat(List1))
3)事前定義されたコレクション数1
var thirdList = new List<TestClass>(List2.Count + List1.Count);
foreach (var testClass in List1)
{
thirdList.Add(testClass);
}
foreach (var testClass in List2)
{
thirdList.Add(testClass);
}
List2 = thirdList;
4)事前定義されたコレクション数2
var thirdList = new List<TestClass>(List2.Count + List1.Count);
thirdList.AddRange(List1);
thirdList.AddRange(List2);
List2 = thirdList;
コレクションの数は、リスト1とリスト2の各リストの要素の数です。そして、そのような結果になりました(コレクションの長さが異なります)。
Array.ForEach(ilist1.ToArray(), x => ilist2.Add(x));
2番目のリストの実行時タイプが_List<T>
_の場合、そのタイプにキャストしてAddRange()
メソッドを使用できます。
それ以外の場合は、ループを使用して自分で行う必要があります。または、linqを使用して、両方のソースリストの内容を含む新しいリストを作成することもできます。