【问题标题】:C# LINQ to group by a list of objects in the format as shown below [duplicate]C#LINQ按如下所示格式按对象列表进行分组[重复]
【发布时间】:2020-02-27 19:56:21
【问题描述】:

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

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

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

 User    Role        Code
 John    admin       100,101
 Smith   superadmin  120,130,140,150,160     
 John    review      180,190,200

我试过了-

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();

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


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;
}

【问题讨论】:

  • 对不起,我不明白你想得到什么,你需要按用户和角色分组吗?
  • 我能够以我想要的格式获取用户和代码,只是无法弄清楚如何获取角色
  • @learner999 - 当一个答案有 8 个赞而另一个 0 时,您可能需要考虑为什么会这样。

标签: c# linq group-by


【解决方案1】:

您可以通过创建匿名类型来按用户和角色进行分组。像这样的:

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();

【讨论】:

    【解决方案2】:

    按角色和用户分组,所以

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

    【讨论】:

    • 您应该跳过或区分重复的Code
    • 你的意思是删除第一部分?
    • u.Select(d => d.Code) 返回给定组的所有 Code 值。 John 的代码值为 100、101、101。您的代码打印出所有这些值,但 OP 希望拥有 John admin 100,101。另外,我不确定您的第一个 sn-p 是否正常工作,似乎它将Johnadmin 角色和Johnreview 角色组合成一个组,这并不完全正确
    • 另外,string.Join 有一个重载,需要一个 IEnumerable,所以你可以删除 ToArray
    • 您对Role = u.First().Role 的使用正在扼杀您对答案的投票。您假设一个用户不能属于两个或多个角色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2022-01-14
    • 2021-12-06
    • 2022-01-21
    相关资源
    最近更新 更多