2010-04-23 52 views
87

我不知道這是在LINQ的可能但在這裏不用...使用LINQ to組對象的列表到對象名單,新的分組列表

我有一個對象:

public class User 
{ 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public int GroupID { get; set; } 
} 

我返回一個列表可能看起來如下:

List<User> userList = new List<User>(); 
userList.Add(new User { UserID = 1, UserName = "UserOne", GroupID = 1 }); 
userList.Add(new User { UserID = 2, UserName = "UserTwo", GroupID = 1 }); 
userList.Add(new User { UserID = 3, UserName = "UserThree", GroupID = 2 }); 
userList.Add(new User { UserID = 4, UserName = "UserFour", GroupID = 1 }); 
userList.Add(new User { UserID = 5, UserName = "UserFive", GroupID = 3 }); 
userList.Add(new User { UserID = 6, UserName = "UserSix", GroupID = 3 }); 

我希望能夠運行上面的列表組中的所有用戶通過組ID在LINQ查詢。因此,輸出將是包含用戶的用戶列表列表(如果這有意義的話)。喜歡的東西:

GroupedUserList 
    UserList 
     UserID = 1, UserName = "UserOne", GroupID = 1 
     UserID = 2, UserName = "UserTwo", GroupID = 1 
     UserID = 4, UserName = "UserFour", GroupID = 1 
    UserList 
     UserID = 3, UserName = "UserThree", GroupID = 2 
    UserList 
     UserID = 5, UserName = "UserFive", GroupID = 3 
     UserID = 6, UserName = "UserSix", GroupID = 3 

我已經使用LINQ GROUPBY子句試圖但這似乎通過正確地返回鍵列表和不分組:

var groupedCustomerList = userList.GroupBy(u => u.GroupID).ToList(); 

任何幫助將非常感激。

感謝

回答

194
var groupedCustomerList = userList 
    .GroupBy(u => u.GroupID) 
    .Select(grp => grp.ToList()) 
    .ToList(); 
+1

非常好,就是我所需要的。謝謝。這樣做的必要途徑很糟糕。 – user1841243 2013-12-13 21:53:46

+0

它工作正常嗎?因爲我用這種方式沒有用。 objModel.tblDonars.GroupBy(t => new {t.CreatedOn.Year,t.CreatedOn.Month,t.CreatedOn.Day})。Select(g => new {tblDonar = g.ToList()})。 ToList();這是行不通的...你能幫忙嗎... – 2014-04-25 09:57:29

+1

不錯,它的工作很好。 – 2016-08-23 09:28:58

24

您的組聲明逐組ID。例如,如果你然後寫:

foreach (var group in groupedCustomerList) 
{ 
    Console.WriteLine("Group {0}", group.Key); 
    foreach (var user in group) 
    { 
     Console.WriteLine(" {0}", user.UserName); 
    } 
} 

應該工作正常。每個組都有一個密鑰,但也包含一個IGrouping<TKey, TElement>,它是一個允許您迭代該組成員的集合。正如Lee提到的,如果你真的想將每個組轉換成一個列表,但如果你只是按照上面的代碼迭代它們,那麼這樣做並沒有真正的好處。

2

對於類型

public class KeyValue 
{ 
    public string KeyCol { get; set; } 
    public string ValueCol { get; set; } 
} 

收集

var wordList = new Model.DTO.KeyValue[] { 
    new Model.DTO.KeyValue {KeyCol="key1", ValueCol="value1" }, 
    new Model.DTO.KeyValue {KeyCol="key2", ValueCol="value1" }, 
    new Model.DTO.KeyValue {KeyCol="key3", ValueCol="value2" }, 
    new Model.DTO.KeyValue {KeyCol="key4", ValueCol="value2" }, 
    new Model.DTO.KeyValue {KeyCol="key5", ValueCol="value3" }, 
    new Model.DTO.KeyValue {KeyCol="key6", ValueCol="value4" } 
}; 

我們的LINQ查詢類似於下面

var query =from m in wordList group m.KeyCol by m.ValueCol into g 
select new { Name = g.Key, KeyCols = g.ToList() }; 

或數組而不是列表像下面

var query =from m in wordList group m.KeyCol by m.ValueCol into g 
select new { Name = g.Key, KeyCols = g.ToList().ToArray<string>() };