将两个锯齿状列表合并为一个

本文关键字:一个 合并 两个 锯齿状 列表 | 更新日期: 2023-09-27 18:32:32

我有两个锯齿状列表。

第一个:

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 }

将不胜感激任何帮助!

将两个锯齿状列表合并为一个

您可以使用

Zip来连接相应的子列表。

var combined = firstList.Zip(secondList, (f,s) => f.Concat(s).ToList()).ToList();
请注意,如果两个列表包含

不同数量的子列表,则结果将仅包含两个列表中较短的子列表。

可以使用属于 System.Linq 命名空间的 Zip 扩展方法。元组可用于关联两个列表中的值。或者你可以只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();

这里的重要思想是你必须连接列表的每个元素,而不是连接两个列表。

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

或任何其他感觉的方式。

另一种选择是循环访问第一个列表,然后添加第二个列表中的元素。 例如:

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