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