如何有条件地合并列表列表

时间:2014-01-08 11:52:09

标签: c# linq lambda

我的问题类似于Link

List<List<T>> listOfList;
       // add three lists of List<T> to listOfList, for example
       /* listOfList = new {
            { "Name 1", 1, 2}, 
            { "Name 1", 3, 4}, 
            { "Name 2", 1, 2}  
            };
       */

我想知道如何合并具有相同名称的项目

       List<T> list = { { "Name 1", 1, 2, 3, 4 }, { "Name 2", 1, 2 } };

我尝试了Concat的方法,但我不知道怎么做条件。

谢谢。

2 个答案:

答案 0 :(得分:3)

假设:

List<List<string>> listOfList = new List<List<string>>(){
           new List<string>() { "Name 1", "1", "2"}, 
           new List<string>() { "Name 1", "3", "4"}, 
           new List<string>() { "Name 2", "1", "2"}  
     };

代码:

var result = listOfList.GroupBy(l => l.First(), 
                               (key, values) => values)
                       .Select(l => l.Aggregate((acc, next) =>
                                                 acc.Concat(next.Skip(1))
                                                    .ToList()))
                       .ToList();

结果:

enter image description here

解释:关于GroupBy元素的LINQ List运算符组First。对于每个组,仅选择values(键不相关,因为它是其中一个值)。然后,对于每个组,我们Aggregate列出所有列表Concat,但省略(Skip(1))第一个包含名称的元素。

答案 1 :(得分:1)

Konrad Kokosa解决方案的变体(SelectMany而不是Aggregate):

        List<List<string>> listOfList = new List<List<string>>()
        {
            new List<string>() { "Name 1", "1", "2"}, 
            new List<string>() { "Name 1", "3", "4"}, 
            new List<string>() { "Name 2", "1", "2"}  
        };
        var result = listOfList
            .GroupBy(grp => grp.First())
            .Select(grp => new List<string>{ grp.Key }.AsEnumerable().Concat(grp.SelectMany(g => g.Skip(1))).ToList())
            .ToList();