2016-01-29 3 views
1

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

Первый один:

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 } 

Im возникли проблемы с сочетания обоих списков в один как этот:

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

Любая попытка Concatenation в результате просто добавив secondList элементов, подобных другим firstList строк типа thi s:

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

Поблагодарили бы за помощь в этом вопросе!

ответ

2

Вы можете использовать метод расширения 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(); 
+0

Спасибо! Постараюсь использовать его! – goliatpiotr

3

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

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

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

+0

Спасибо. Это сработало отлично! – goliatpiotr

+0

На самом деле, я считаю, что это лучший ответ ... Я также узнал от вас новую вещь: 'Zip'. :) – Ian

1

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

  1. Concat каждый элемент:

    { dd ff gg hh } //each element dd ff is concatted with gg hh 
    { dd ff gg uu } 
    { dd ff hh uu } 
    
  2. Concat списков:

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

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

+0

Спасибо! Постараюсь использовать его! – goliatpiotr

0

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

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]); 
} 
+0

Возможно также использовать 'list1 [j]' вместо 'list1.ElementAt (j)'. – juharr

+0

Согласен. Ответ обновлен – chief7