假设我有三个用户,我想按国家对他们进行分组.我会这样做:
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)