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

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

Первый:

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 }

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

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();

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

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

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

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

  1. Concat каждого элемента:

    { 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();

Или любой другой способ испытать желание сделать это.

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

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]);
}
Другие вопросы по тегам