【问题标题】:Grouping and string concatenate in LINQ C#LINQ C#中的分组和字符串连接
【发布时间】:2017-07-31 12:51:57
【问题描述】:

我是 C# linq 的新手。

我的数据结果如下,

Id | Name   | Code
1  | Go     | GOS
1  | RES    | RECSO
1  | ICS    | ICSO 
2  | Go     | GOS
2  | ICS    | ICSO 

我想要的结果如下,

Id | Name     | Code
1, Go,RES,ICS | GOS,RECSO,ICSO 
2, Go,ICS     | GOS,ICSO

有人可以为此提供 linq 查询,以优化的方式,因为我有大数据集。

提前致谢

【问题讨论】:

标签: c# linq c#-4.0 lambda


【解决方案1】:
var result = data.GroupBy(g => g.Id)
.Select(s => new {
    Id = s.Key,
    Name = string.Join(",", s.Select(ss => ss.Name)),
    Code = string.Join(",", s.Select(ss => ss.Code)),
});

【讨论】:

  • 虽然这段代码可能会回答这个问题,但最好解释一下这段代码的工作原理和原因。为您的答案提供一些背景信息。
【解决方案2】:

您需要按Id 对数据进行分组,然后使用string.Join 获取NameCode 的逗号分隔值

var query = from m in Data
            group m by m.Id into grp
            select new {ID = grp.Key
                       ,Name= string.Join(",",grp.Select(g=>g.Name ))
                       ,Code= string.Join(",",grp.Select(g=>g.Code )) };

如果您的数据源是 EF 或 LinqtoSQL 或任何其他 ORM,则使用 Data.AsEnumerable() 强制在内存中进行分组和字符串连接

否则会报错(如果是EF)或者会为每一行生成SQL查询(LinqToSQL)

【讨论】:

    【解决方案3】:

    这个怎么样:

    LINQ 部分:

    List<BeforeData> listBefore = new List<BeforeData>();
    Dictionary<int, List<AfterData>> listAfter = listBefore
                    .GroupBy(it => it.ID)
                    .ToDictionary(x => x.Key, y => y.Select(z => new AfterData(z.name, z.code)).ToList());
    

    假设类:

    public class BeforeData
    {
        public int ID;
        public string name, code;
    
        public BeforeData(int ID, string name, string code)
        {
            this.ID = ID;
            this.name = name;
            this.code = code;
        }
    }
    
    public class AfterData
    {
        public string name, code;
    
        public AfterData(string name, string code)
        {
            this.name = name;
            this.code = code;
        }
    }
    

    编辑:简化的 LINQ

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      相关资源
      最近更新 更多