2014-03-28 221 views
9

假设我有三个用户,并且我想按他们的国家进行分组。我这样做:合并两个IGrouping集合

var users = new[] 
{ 
    new User { Name = "Phil", Country = "UK" }, 
    new User { Name = "John", Country = "UK" }, 
    new User { Name = "Mike", Country = "USA" } 
}; 

List<IGrouping<string, User>> groupedUsers 
    = users.GroupBy(user => user.Country).ToList(); 

现在假设我的程序得到三个用户后,所以我组他们太多:

var moreUsers = new[] 
{ 
    new User { Name = "Phoebe", Country = "AUS" }, 
    new User { Name = "Joan", Country = "UK" }, 
    new User { Name = "Mindy", Country = "USA" } 
}; 

List<IGrouping<string, User>> moreGroupedUsers 
    = moreUsers.GroupBy(user => user.Country).ToList(); 

我现在有两个独立的团体,groupedUsersmoreGroupedUsers。我怎样才能将它们合并成一个,同时保持分组有效?

+0

合并排序是直接的答案,您应该只添加一个列表到另一个列表并重新排序。 – knightsb

回答

11

由于IGrouping<,> API不提供突变的界面,你将需要:

  • 简单地拼接和重新组
  • 使用变异容器代替,也许Dictionary<string, List<User>>您可以向其中添加

第一个听起来更简单。它可以是:

var groupedUsers = groupedUsers.SelectMany(grp => grp) 
     .Concat(moreUsers) 
     .GroupBy(x => x.Country).ToList(); 

或:

var groupedUsers = users.Concat(moreUsers) 
     .GroupBy(x => x.Country).ToList(); 

(如果你仍然有users可用)

后者可以用做:

var mutable = users.GroupBy(user => user.Country).ToDictionary(
     grp => grp.Key, grp => grp.ToList()); 

然后(以附加):

foreach(var user in moreUsers) { 
    List<User> list; 
    if(!mutable.TryGetValue(user.Country, out list)) { 
     mutable.Add(user.Country, list = new List<User>()); 
    } 
    list.Add(user); 
}