web-dev-qa-db-ja.com

あるList <Type>を別のList <Type>に追加する簡単な方法はありますか?

サンプルコードは次のとおりです。

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

あるリストの内容を別のリストに追加するにはどうすればよいですか?これを行う方法はありますか?

15

これを行うための優れた組み込みの方法はありません。本当に必要なのは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);
24
JaredPar

両方のリストタイプを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);
12
Igal Tabachnik

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の各リストの要素の数です。そして、そのような結果になりました(コレクションの長さが異なります)。

results for calculation

11
Lonli-Lokli

私はこの1行のアプローチを使用しました:

Array.ForEach(ilist1.ToArray(), x => ilist2.Add(x));

0
arturomonriv

2番目のリストの実行時タイプが_List<T>_の場合、そのタイプにキャストしてAddRange()メソッドを使用できます。

それ以外の場合は、ループを使用して自分で行う必要があります。または、linqを使用して、両方のソースリストの内容を含む新しいリストを作成することもできます。

0
phoog