合并两个IGrouping集

Phi*_*l K 9 .net c# linq

假设我有三个用户,我想按国家对他们进行分组.我会这样做:

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();
Run Code Online (Sandbox Code Playgroud)

现在假设我的程序稍后会再增加三个用户,所以我也将它们分组:

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();
Run Code Online (Sandbox Code Playgroud)

我现在有两个单独的分组,groupedUsers并且moreGroupedUsers.如何在保持分组有效的同时将它们合并为一个?

Mar*_*ell 11

由于IGrouping<,>API不提供变异接口,您需要:

  • 简单地连接和重新组合
  • 改为使用变异容器,也许Dictionary<string, List<User>>你可以添加

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

var groupedUsers = groupedUsers.SelectMany(grp => grp)
        .Concat(moreUsers)
        .GroupBy(x => x.Country).ToList();
Run Code Online (Sandbox Code Playgroud)

要么:

var groupedUsers = users.Concat(moreUsers)
        .GroupBy(x => x.Country).ToList();
Run Code Online (Sandbox Code Playgroud)

(如果你还有users空的话)

后者可以通过以下方式完成:

var mutable = users.GroupBy(user => user.Country).ToDictionary(
        grp => grp.Key, grp => grp.ToList());
Run Code Online (Sandbox Code Playgroud)

然后(追加):

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);
}
Run Code Online (Sandbox Code Playgroud)