LINQ C#中的分组和字符串连接

时间:2017-07-31 12:51:57

标签: c# linq c#-4.0 lambda

我是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查询,因为我有大数据集。

提前致谢

3 个答案:

答案 0 :(得分:3)

您需要按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)

答案 1 :(得分:2)

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 :(得分:0)

这个怎么样:

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