Есть ли простой способ добавить один 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 для создания нового списка, содержащего содержимое обоих исходных списков.