如何按内部列表对项目进行分组

时间:2018-09-14 09:29:32

标签: c# linq

我想根据其UserGroup的列表分组。
一个用户可以在多个组中。

public class User
{
    public string Username { get; set; }
    public List<Group> Groups { get; set; }
}

BusinessLogic向我返回了List<User>
我需要重新定义此列表,以便“组”包含用户,而不是“用户”具有其组。

示例:
第1组
 -用户1
 -用户2
第2组
-用户1
-用户3
第3组
-用户2
-用户3

我被困在需要使用的扩展方法上,所以我不确定要搜索什么。
我会假设使用GroupBy方法,但此后我迷路了:)

1 个答案:

答案 0 :(得分:3)

使用SelectMany展平嵌套的集合是检索用户及其组的元组。这样,包含多个组的使用将导致多个记录。下一组按该组记录,并将用户保留为该组中的项目

var result = userList.SelectMany(user => user.Groups.Select(group => (user,group)))
                     .GroupBy(item => item.group, item => item.User);

在当前实现中,当对Group对象执行group by时,该对象应实现EqualsGetHashCode。如果您不想这样做,则存在一个过载,该过载还会收到一个IEqualityComparer。有关更多详细信息,请参见documentation

注意使用命名元组。如果您使用的是7.0之前的C#,则可以投影一个匿名对象,或显式初始化一个元组,然后更改访问属性的方式-Item1Item2