2017-07-20 59 views
0

如何按屬性分組並選擇其他屬性作爲使用LINQ的列表?Linq GroupBy並選擇其他屬性作爲列表

我不善於所以在這裏解釋它是一個例子:

可以說我有能以JSON表示這樣的C#對象的列表:

[ 
    { "id":123, "name":"John", "carId":1, "carAge":3 }, 
    { "id":123, "name":"John", "carId":2, "carAge":4 }, 
    { "id":4, "name":"Mary", "carId":3, "carAge":3 }, 
    { "id":4, "name":"Mary", "carId":4, "carAge":3 }, 
    { "id":123, "name":"John", "carId":5, "carAge":3 } 
] 

在所有這些對象只carId是獨一無二的。

我想按人物詳細分組,並將這些詳細信息與連接的車輛詳細信息結合起來。

最終的結果是這樣的,但作爲C#對象:

[ 
    {"id":123, "name":"John", 
     [ 
      {"carId":1, "carAge":3}, 
      {"carId":2, "carAge":4}, 
      {"carId":5, "carAge":3} 
     ] 
    }, 
    {"id":4, "name":"Mary", 
     [ 
      {"carId":3, "carAge":3}, 
      {"carId":4, "carAge":3} 
     ] 
    } 
] 

編輯:

我卡後

list.GroupBy(x => new { x.Id, x.Name }) 

,因爲我不需要任何集合函數,但只有選擇。

對於沒有發佈更多的代碼,這是一個簡化的版本,真實的東西有更多的過濾和令人費解的領域特定的術語,我很抱歉。

一切都在內存中完成 - 沒有DB擔心。

+6

請顯示您的嘗試。我們可以從那裏幫助。有很多來源可以看到如何分組和項目 –

+2

提供[mcve]會使事情變得更簡單。看起來這是一個簡單的'GroupBy'操作,您可以在其中指定單獨的鍵和元素選擇器,但使用代碼時可以更容易地進行說明。 –

+0

https://stackoverflow.com/questions/2280183/how-to-group-by-custom-types-with-linq應該可以幫到你。看起來像組合鍵分組 - 從2值是你需要的 – Vladimir

回答

3

對於group _ by _表達式的每個部分,創建一個具有所需字段的匿名對象。

通過以下任何一種方式,您將爲每個密鑰構建一個嵌套集合 - 使用GroupBy時,它不僅僅關於聚合,還涉及對特定數據組的操作。其中一種情況是聚合方法。

var result = from item in data 
      group new { item.carId, item.carAge } by new {item.id, item.name} into g 
      select g; 

另一種方式是

var result = from item in data 
      group by new {item.id, item.name} into g 
      select new { 
       g.Key, 
       Data = g.Select(i => new {i.carId, i.carAge}) 
      }; 

使用方法的語法,你試過,你可以使用以下過載:

var result = data.Group(k => new {k.id, k.name}, 
         e => new {e.carId, e.carAge}); 

或者,如果不只是添加了Select投影:

var result = data.Group(k => new {k.id, k.name}) 
       .Select(g => new { 
        g.Key, 
        Data = g.Select(i => new {i.carId, i.carAge}) 
       }); 
+0

@TadijaBagarić - 歡迎您:) –