Объедините два зубчатых списка в один
У меня два зубчатых списка.
Первый:
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();
Обратите внимание, что если два списка содержат различное количество подсписков, результат будет иметь только столько, сколько короче два списка.
Важная идея здесь заключается в том, что вы должны объединять каждый элемент списка, а не объединять два списка.
Concat каждого элемента:
{ dd ff gg hh } //each element dd ff is concatted with gg hh { dd ff gg uu } { dd ff hh uu }
Конкат списки:
{ 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]);
}