C# LINQ 按如下所示格式的对象列表进行分组

lea*_*999 4 c# linq group-by

我有一个这种格式的数据列表 -

User    Role        Code
John    admin       101
John    admin       101
John    admin       100
Smith   superadmin  150
Smith   superadmin  120
Smith   superadmin  130
Smith   superadmin  140
Smith   superadmin  160
John    review      180
John    review      190
John    review      200
Run Code Online (Sandbox Code Playgroud)

我想根据这样的普通用户折叠它 -

 User    Role        Code
 John    admin       100,101
 Smith   superadmin  120,130,140,150,160     
 John    review      180,190,200
Run Code Online (Sandbox Code Playgroud)

我试过这个 -

result = userRoles.GroupBy(l => l.User).Select(u => new UserRole()
{ 
    Code = string.Join(", ", userRoles.Where(d => d.User ==  u.Key)
                                      .Select(d => d.Code)
                                      .ToArray()),
    User = u.Key,
}).ToList();
Run Code Online (Sandbox Code Playgroud)

我已经达到了能够以上述代码的格式显示用户和代码的程度,只是想弄清楚如何适应角色,任何帮助将不胜感激。


var userRoles = new[]
{
    new UserRole() { User = "John", Role = "admin", Code = "101" },
    new UserRole() { User = "John", Role = "admin", Code = "101" },
    new UserRole() { User = "John", Role = "admin", Code = "100" },
    new UserRole() { User = "Smith", Role = "superadmin", Code = "150" },
    new UserRole() { User = "Smith", Role = "superadmin", Code = "120" },
    new UserRole() { User = "Smith", Role = "superadmin", Code = "130" },
    new UserRole() { User = "Smith", Role = "superadmin", Code = "140" },
    new UserRole() { User = "Smith", Role = "superadmin", Code = "160" },
    new UserRole() { User = "John", Role = "review", Code = "180" },
    new UserRole() { User = "John", Role = "review", Code = "190" },
    new UserRole() { User = "John", Role = "review", Code = "200" },
};

public class UserRole
{
    public string User;
    public string Role;
    public string Code;
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*and 9

您可以按组两个用户和角色创建一个匿名类型。像这样的东西:

result = userRoles.GroupBy(l => new { l.User, l.Role }).Select(u => new
{
    Code = string.Join(", ", u.Select(d => d.Code).Distinct().OrderBy(d => d)),
    User = u.Key.User,
    Role = u.Key.Role
}).ToList();
Run Code Online (Sandbox Code Playgroud)