[ C# 開發隨筆 ] Linq GroupBy 將相同Key資料的欄位合併的方法

最近被問到怎麼將GroupBy 後的資料,怎麼把他們的欄位合併的問題,所以就順手寫了一篇。 

先把簡單的答案放在這裡:

 var data = dataList.GroupBy(p => p.Id).Select(g => new TestModel() {    Id = g.Key, info = string.Join(',', g.Select(p => p.info).ToList()) });

這邊我就就從頭說起,假如我有四筆資料如下:

var dataList = new List<TestModel>()
{
    new TestModel() {Id = "C8763", info = "9527",},
    new TestModel() {Id = "C8763", info = "7704",},
    new TestModel() {Id = "C8763", info = "7706",},
    new TestModel() {Id = "C9487", info = "7706",},
};

當我的有個期望,要把C8763的資料統整起來,Info我要用逗點隔開的資料如下:

[
  {
    "id": "C8763",
    "info": "9527,7704,7706"
  },
  {
    "id": "C9487",
    "info": "7706"
  }
]

我用以下方法得到我要的期望結果:

var data = dataList.GroupBy(p => p.Id).Select(g =>
{
    // 取得 group by 後的第一筆資料作為基準
    var result = g.FirstOrDefault() ?? new TestModel();

    // 然後把相同Key 的Account 都取出來拼起來丟進result
    result.info = string.Join(',', g.Select(p => p.info).ToList());

    return result;
});

這樣就大功告成了,常常遇到很多新手階段的人搞不懂 GroupBy出來的型態,常常會想要把GroupBy完的型態直接丟給原物件去接,想當然一定會看到一大條紅紅的毛毛蟲。

如有指正之處,歡迎隨時提出