Список <T> Конкатенация для 'X' сумма списков

У меня есть, например, 5 Списков весь тот же тип. Я могу просто сделать

List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....
6
задан JaredPar 1 March 2010 в 17:35
поделиться

7 ответов

, вы можете, но не забудьте добавить .ToList (); в конце. также вы можете вызвать newset.AddRange (ListX); я думаю, что это лучше с точки зрения производительности

4
ответ дан 8 December 2019 в 03:26
поделиться

Вы можете это сделать (хотя в конце вам понадобится .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);
13
ответ дан 8 December 2019 в 03:26
поделиться

Если вы хотите объединить произвольное (ранее неизвестное) количество списков, вам может потребоваться объединить коллекцию списков. Вероятно, самый простой способ сделать это - использовать оператор 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.

3
ответ дан 8 December 2019 в 03:26
поделиться

Вы, конечно, можете это сделать, хотя это может быть не очень эффективно.

Как указано в других ответах, не забудьте добавить .ToList () в конец вашей строки кода или использовать List1.AddRange (List2); List1.AddRange (List3); ... для повышения эффективности.

1
ответ дан 8 December 2019 в 03:26
поделиться

Да, вы можете это сделать.

List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
5
ответ дан 8 December 2019 в 03:26
поделиться

Для переменного количества списков:

IEnumerable<T> enumerable = Enumerable.Empty<T>();
foreach (List<T> list in [whatever])
   enumerable = enumerable.Concat(list);

В конце вы можете добавить "ToList()", если вам нужен повторный список:

List<T> list = enumerable.ToList();

Однако, это может не понадобиться.

2
ответ дан 8 December 2019 в 03:26
поделиться

вы можете использовать объединение в LINQ, если это настоящее объединение, которое вы хотите сделать, конечно...

1
ответ дан 8 December 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: