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

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

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

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

Ответы [ 4 ]

24 голосов
/ 01 марта 2012

Нет великолепного встроенного способа сделать это.На самом деле вам нужен метод 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);
11 голосов
/ 01 марта 2012

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

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

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

EDIT

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

1) AddRange через Add

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) Concat

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;

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

results for calculation

11 голосов
/ 01 марта 2012

Если вы объявляете оба типа списка как конкретный 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);
0 голосов
/ 01 марта 2012

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

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

...