C# 如何按内部列表对项目进行分组
我想根据用户的C# 如何按内部列表对项目进行分组,c#,linq,C#,Linq,我想根据用户的组对用户的列表进行分组 一个用户可以在多个组中 public class User { public string Username { get; set; } public List<Group> Groups { get; set; } } 公共类用户 { 公共字符串用户名{get;set;} 公共列表组{get;set;} } BusinessLogic返回给我一个列表 我需要修改此列表,使组包含用户,而不是用户的组 示例: 第一组: -用户1
组对用户的列表进行分组
一个用户可以在多个组中
public class User
{
public string Username { get; set; }
public List<Group> Groups { get; set; }
}
公共类用户
{
公共字符串用户名{get;set;}
公共列表组{get;set;}
}
BusinessLogic返回给我一个列表
我需要修改此列表,使组包含用户,而不是用户的组
示例:
第一组:
-用户1
-用户2
第2组:
-用户1
-用户3
第三组:
-用户2
-用户3
我无法确定需要使用哪种扩展方法,因此不确定要搜索什么。
我假设使用GroupBy
方法,但之后我就迷路了:)使用SelectMany
来展开嵌套集合是检索用户及其组的元组。这样,包含多个组的使用将导致多个记录。下一组按组记录,并将用户保留为组中的项目
var result = userList.SelectMany(user => user.Groups.Select(group => (user,group)))
.GroupBy(item => item.group, item => item.User);
在当前实现中,由于GROUPBY是在group
对象上执行的,因此该对象应该实现Equals
和GetHashCode
。如果您不想这样做,则存在一个重载,该重载还接收一个IEqualityComparer
。有关更多详细信息,请参阅
注意命名元组的使用。如果您使用的是7.0之前的C#,那么您可以投影一个匿名对象,或者显式初始化元组,然后还可以更改访问属性的方式-Item1
和Item2
接受答案中提出的解决方案不起作用。我的解决方案:
var result1 = from user in users
from grp in user.Groups
group user by grp into pivot
select pivot;
Gilad代码的固定版本:
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; }
}
你是对的,代码没有按预期工作,但它使我走上了正确的轨道。我相信我可以接受这两个答案:)
Group1
User1
User2
Group2
User1
User3
Group3
User2
User3
Group1
User1
Group2
User1
Group1
User2
Group3
User2
Group2
User3
Group3
User3