Объединить два зубчатых списка в один

У меня есть два зубчатых списка.

Первый:

List<List<string>> firstList = new List<List<string>>();

{ dd ff }
{ dd ff }
{ dd ff }

Второй:

List<List<string>> secondList = new List<List<string>>();

{ gg hh }
{ gg uu }
{ hh uu }

У меня возникла проблема с объединением обоих списков в один, подобный этому:

{ dd ff gg hh }
{ dd ff gg uu }
{ dd ff hh uu }

Любая попытка конкатенации приводила к простому добавлению secondList элементов, таких как еще firstList строк, например:

{ dd ff }
{ dd ff }
{ dd ff }
{ gg hh }
{ gg uu }
{ hh uu }

Был бы признателен за любую помощь с этим!


person goliatpiotr    schedule 29.01.2016    source источник


Ответы (4)


Вы можете использовать метод расширения Zip, который является частью пространства имен System.Linq. Кортежи можно использовать для связывания значений из обоих списков. Или вы можете просто Concat внутренних списков.

var list1 = new List<List<string>>
{
    new List<string> { "dd", "ff" },
    new List<string> { "dd", "ff" },
    new List<string> { "dd", "ff" },
};

var list2 = new List<List<string>>
{
    new List<string> { "gg", "hh" },
    new List<string> { "gg", "uu" },
    new List<string> { "hh", "uu" },
};

var result = list1.Zip(list2, (l1, l2) => Tuple.Create(l1, l2)).ToList();
person Dmitry S.    schedule 29.01.2016
comment
Спасибо! Попробую использовать! - person goliatpiotr; 29.01.2016

Вы можете использовать Zip, чтобы сделать это, чтобы объединить соответствующие подпрограммы. -списки.

var combined = firstList.Zip(secondList, (f,s) => f.Concat(s).ToList()).ToList();

Обратите внимание, что если два списка содержат разное количество подсписков, в результате будет столько же, сколько меньше из двух списков.

person juharr    schedule 29.01.2016
comment
На самом деле, я чувствую, что это лучший ответ... Я также узнал от вас новую вещь: Zip. :) - person Ian; 29.01.2016

Важная идея заключается в том, что вам нужно объединить каждый элемент списка, а не два списка.

  1. Объединить каждый элемент:

    { dd ff gg hh } //each element dd ff is concatted with gg hh
    { dd ff gg uu }
    { dd ff hh uu }
    
  2. Объединить списки:

    { dd ff }
    { dd ff }
    { dd ff }   //elements from the 1st list
    ----------- concated with
    { gg hh }   
    { gg uu }
    { hh uu }  //elements from the 2nd list
    

Вы можете Concat каждый элемент списка (который должен иметь одинаковое количество элементов или второй на больше номер, чем первый) следующим образом:

List<List<string>> finalList = (from x in firstList
                                join y in secondList
                                on firstList.IndexOf(x) equals secondList.IndexOf(y)
                                select x.Concat(y).ToList()).ToList();

Или любой другой способ почувствовать, как это сделать.

person Ian    schedule 29.01.2016
comment
Спасибо! Попробую использовать! - person goliatpiotr; 29.01.2016

Другой вариант - просто пройтись по первому списку и добавить элементы из второго списка. Например:

var list1 = new List<List<string>> {
    new List<string> { "dd", "ff" },
    new List<string> { "dd", "ff" },
    new List<string> { "dd", "ff" }};

var list2 = new List<List<string>> {
    new List<string> { "gg", "hh" },
    new List<string> { "gg", "uu" },
    new List<string> { "hh", "uu" }};

for(var j = 0; j < list1.Count(); j++)
{
    list1[j].AddRange(list2[j]);
}
person chief7    schedule 29.01.2016
comment
Можно также использовать list1[j] вместо list1.ElementAt(j). - person juharr; 29.01.2016