У меня есть, например, 5 Списков весь тот же тип. Я могу просто сделать
List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
, вы можете, но не забудьте добавить .ToList ();
в конце.
также вы можете вызвать newset.AddRange (ListX);
я думаю, что это лучше с точки зрения производительности
Вы можете это сделать (хотя в конце вам понадобится .ToList ()
).
Однако было бы (немного) эффективнее создать один список и использовать AddRange для добавления в каждый список. Просто инициализируйте список, указав общий размер всех ваших списков, а затем повторно вызовите AddRange.
Вы можете подумать о том, чтобы сделать что-то вроде:
public List<T> ConcatMultiple<T>(this List<T> list, params[] ICollection<T> others)
{
List<T> results = new List<T>(list.Count + others.Sum(i => i.Count));
results.AddRange(list);
foreach(var l in others)
results.AddRange(l);
return results;
}
Затем позвонив по:
List<MyClass> newset = List1.ConcatMultiple(List2, List3, List4);
Если вы хотите объединить произвольное (ранее неизвестное) количество списков, вам может потребоваться объединить коллекцию списков. Вероятно, самый простой способ сделать это - использовать оператор SelectMany
(или вложенные предложения из
в запросе LINQ):
IEnumerable<List<int>> lists = /* get list of lists */;
List<int> result = lists.SelectMany(e => e).ToList();
Оператор SelectMany
вызывает заданная функция для каждого элемента входного списка (который является списком), а затем объединяет все результирующие списки (фактические списки из вашего входного списка списков). В качестве альтернативы можно использовать синтаксис запроса LINQ:
List<int> result = (from l in lists
from e in l select e).ToList();
Я считаю, что компилятор C # может действительно оптимизировать это, чтобы он не перебирал все отдельные элементы (и делал то же самое, что и явная версия выше). Если у вас есть известное количество списков, вы, конечно, можете написать:
List<int> result = (from l in new[] { list1, list2, list3, list4 }
from e in l select e).ToList();
Это не так элегантно, как определение вашего собственного метода именно для этой цели, но оно показывает, насколько мощным является синтаксис запросов LINQ.
Вы, конечно, можете это сделать, хотя это может быть не очень эффективно.
Как указано в других ответах, не забудьте добавить .ToList ()
в конец вашей строки кода или использовать List1.AddRange (List2); List1.AddRange (List3); ...
для повышения эффективности.
Да, вы можете это сделать.
List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
Для переменного количества списков:
IEnumerable<T> enumerable = Enumerable.Empty<T>();
foreach (List<T> list in [whatever])
enumerable = enumerable.Concat(list);
В конце вы можете добавить "ToList()", если вам нужен повторный список:
List<T> list = enumerable.ToList();
Однако, это может не понадобиться.
вы можете использовать объединение в LINQ, если это настоящее объединение, которое вы хотите сделать, конечно...