2010-04-23 39 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>() }; 
相关问题