c# - 合并两个 IGrouping 集

标签 c# .net 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();

现在假设我的程序稍后有另外三个用户,所以我也将他们分组:

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。如何在保持分组有效的同时将它们合并为一个?

最佳答案

IGrouping<,> API 不提供可变接口(interface),您需要:

  • 简单地连接和重新分组
  • 改用可变容器,可能是 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);
}

关于c# - 合并两个 IGrouping 集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22713358/

相关文章:

c# - 仅在初始打开时设置我的组合框的默认索引

c# - 在强类型列表上尝试 "where"时出错,错误 CS0103

.net - 并行化具有不同边界的多个相关操作

c# - LINQ 在 Where 字符串中聚合

c# - LINQ to XML 到数据表

c# - 正则表达式匹配变量多行?

c# - 可以将泛型类型限制为枚举吗?

c# - 用 HTML5 播放 wav

c# - GetDCEx 在表单显示之前返回 null。在非客户区绘图

asp.net - 如何设置默认页面 asp.net