【问题标题】:Combine two jagged lists into one将两个锯齿状列表合二为一
【发布时间】:2016-01-29 03:12:25
【问题描述】:

我有两个锯齿状列表。

第一个:

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 }

不胜感激!

【问题讨论】:

    标签: c# concatenation concat jagged-arrays


    【解决方案1】:

    您可以使用Zip 来连接相应的子列表。

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

    请注意,如果两个列表包含不同数量的子列表,则结果将只有两个列表中较短者的数量。

    【讨论】:

    • 其实我觉得这是最好的答案...我也从你那里学到了新东西:Zip。 :)
    【解决方案2】:

    您可以使用属于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();
    

    【讨论】:

    • 谢谢!会尝试使用它!
    【解决方案3】:

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

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

    或任何其他感觉喜欢的方式。

    【讨论】:

    • 谢谢!会尝试使用它!
    【解决方案4】:

    另一种选择是遍历第一个列表并添加第二个列表中的元素。例如:

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

    【讨论】:

    • 还不如使用list1[j] 而不是list1.ElementAt(j)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2015-06-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多