Список <T>Конкатенация для количества списков 'X' - PullRequest
5 голосов
/ 01 марта 2010

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

List<T> newset = List1.Concat(List2).Concat(List3).Concat(List4).....

Ответы [ 7 ]

13 голосов
/ 01 марта 2010

Вы можете сделать это (хотя вам нужно .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);
5 голосов
/ 01 марта 2010

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

List<Thing> newSet = List1.Concat(List2).Concat(List3).Concat(List4).ToList();
4 голосов
/ 01 марта 2010

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

3 голосов
/ 01 марта 2010

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

1 голос
/ 01 марта 2010

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

1 голос
/ 01 марта 2010

Для списка переменных:

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

В конце вы можете добавить «ToList ()», если хотите получить список доверия:

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

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

1 голос
/ 01 марта 2010

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

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

...