【问题标题】:How do merge a list of lists conditionally如何有条件地合并列表列表
【发布时间】:2014-01-26 12:11:26
【问题描述】:

我的问题与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的方法,但是不知道怎么做条件。

谢谢。

【问题讨论】:

  • 你认为什么相似
  • “名称”(例如名称 1、名称 2);
  • 这段代码还能编译吗? Name 是字符串吗?如果是这样,为什么不在引号中?
  • @WillianCândido: 那么"Name1 1" 也类似于"Name2 2" 吗?但是,您可以使用levenshtein 来计算相似度。但这将是低效的,因为您需要将每个项目与所有其他项目进行比较。
  • 鉴于所需的输出,我认为他的意思是一个“名称 1”与另一个“名称 1”相似(实际上相同),他只想将所有不同的数字条目分组在“名称 1”下”。 “名称 2”条目仍然是单独的一组。但很难确定,因为这个问题太不精确了。

标签: c# linq lambda


【解决方案1】:

给定:

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

结果:

说明:LINQ GroupBy 运算符组Lists 与First 元素相关。对于每个组,仅选择 values(键不相关,因为它是值之一)。然后,对于每个组,我们通过ConcatAggregate 列出所有组,但省略 (Skip(1)) 包含名称的第一个元素。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多