我想将User
的列表按他们的Group
分类。
用户可以在多个组中。
public class User
{
public string Username { get; set; }
public List<Group> Groups { get; set; }
}
BusinessLogic返回给我一个List<User>
。
而不是用户有他们的组,我需要修改这个列表,以便组包含用户。
示例:
集团1
我被困在需要使用的扩展方法上,所以我不知道该搜索什么。
我假设是GroupBy
方法,但在那之后我就迷路了:)
发布于 2018-09-14 09:39:33
使用SelectMany
来扁平嵌套集合是检索用户及其组的元组。这样,包含多个组的使用将产生多个记录。下一组按组记录,并将用户保留为组中的项。
var result = userList.SelectMany(user => user.Groups.Select(group => (user,group)))
.GroupBy(item => item.group, item => item.User);
在当前实现中,当组by在Group
对象上执行时,该对象应该实现Equals
和GetHashCode
。如果您不想这样做,那么就会存在一个重载,它也会接收一个IEqualityComparer
。有关更多细节,请参见文档。
注意命名元组的用法。如果在7.0之前使用的是C#,那么可以用匿名对象代替或显式初始化元组,然后还可以更改访问属性的方式-- Item1
和Item2
__。
发布于 2018-09-14 10:18:28
在接受的答案中提出的解决方案不起作用。我的解决方案:
var result1 = from user in users
from grp in user.Groups
group user by grp into pivot
select pivot;
吉拉德代码的修正版本:
var result = users.SelectMany(user => user.Groups,(user, group)=>(user,group))
.GroupBy(item => item.group,item=>item.user);
我和吉拉德的完整代码:
static void Main(string[] args)
{
Group group1 = new Group("Group1");
Group group2 = new Group("Group2");
Group group3 = new Group("Group3");
List<User> users = new List<User>(new User[] {
new User() { Username = "User1", Groups = new List<Group>(new Group[] { group1,group2}) },
new User() { Username = "User2", Groups = new List<Group>(new Group[] { group1,group3}) },
new User() { Username = "User3", Groups = new List<Group>(new Group[] { group2,group3}) }
});
var result1 = from user in users
from grp in user.Groups
group user by grp into pivot
select pivot;
foreach (var r in result1)
{
Console.WriteLine(r.Key.Name);
foreach (var u in r)
Console.WriteLine(u.Username);
}
Console.WriteLine();
var result = users.SelectMany(user => user.Groups.Select(group => (user, group))
.GroupBy(item => item.group,item=>item.user));
foreach (var r in result)
{
Console.WriteLine(r.Key.Name);
foreach (var u in r)
Console.WriteLine(u.Username);
}
Console.ReadKey();
}
public class Group : IEquatable<Group>
{
public Group(string name)
{
Name = name;
}
public string Name { get; set; }
public bool Equals(Group other)
{
return other.Name == Name;
}
public override bool Equals(object obj)
{
return ((Group)obj).Name==Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
public class User
{
public string Username { get; set; }
public List<Group> Groups { get; set; }
}
输出(第一个是我的代码,第二个是Gilad的代码输出):
Group1
User1
User2
Group2
User1
User3
Group3
User2
User3
Group1
User1
Group2
User1
Group1
User2
Group3
User2
Group2
User3
Group3
User3
https://stackoverflow.com/questions/52328982
复制相似问题