使用Linq将对象列表分组到对象列表的新分组列表中

我不知道这是否可能在Linq,但这里呢…

我有一个对象:

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 } ); 

我希望能够在上面的列表中运行Linq查询,通过GroupID对所有用户进行分组。 所以输出将是包含用户的用户列表的列表(如果这有意义的话)。 就像是:

 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 

我试过使用groupby linq子句,但是这似乎返回一个键的列表,并没有正确分组:

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

任何帮助将不胜感激。

谢谢

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

你的小组声明将按组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所说,如果你真的想把每个组转换成一个列表,但是如果你只是按照上面的代码迭代它们,那么这样做并没有真正的好处。

对于types

 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>() };