Есть ли простой способ добавить один IList <MyType> к другому?

Вот пример кода:

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

Как добавить содержимое одного списка в другой - есть ли способ для этого?

Ответы

Ответ 1

Там нет большого встроенного способа сделать это. На самом деле вы хотите использовать метод 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);

Ответ 2

Используйте расширение Enumerablr,

myList2=new List<MyType>(myList2.Concat(myList1))

Кстати, если вы не заполняете myList2, вы можете просто создать его на основе myLis1.

ИЗМЕНИТЬ

Я пытаюсь исследовать производительность для нескольких случаев.

1) 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;

Count Count - это подсчет элементов для каждого списка, List1 и List2: И пришли к таким результатам (с различной длиной коллекции)

results for calculation

Ответ 3

Если вы объявляете оба типа списка как конкретный List вместо IList, вы можете использовать метод AddRange:

List<MyType> myList1=new List<MyType>();
List<MyType> myList2=new List<MyType>();

myList2.AddRange(myList1);

иначе вы могли бы использовать LINQ для объединения двух:

using System.Linq;

IList<MyType> myList1=new List<MyType>();
IList<MyType> myList2=new List<MyType>();

var newList = myList1.Concat(myList2);

Ответ 4

Если тип во время выполнения второго списка List<T>, вы можете применить его к этому типу и использовать метод AddRange().

В противном случае вы должны сделать это самостоятельно с помощью цикла. Кроме того, вы можете использовать linq для создания нового списка, содержащего содержимое обоих исходных списков.