假设我有三个用户,我想按他们所在的国家/地区对他们进行分组。我会这样做:
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();
我现在有两个单独的分组,groupedUsers
和 moreGroupedUsers
。如何在保持分组有效的同时将它们合并为一个?
最佳答案
自 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/