c# - 如何构建这个 LINQ 表达式?

标签 c# linq collections lambda

我有一个如下所示的类:

class UserProfile { public int Id; public int? ParentId; public string Name; public string Role; }

每个用户配置文件都是用户或管理员。每个用户可能是单个管理员的子代,其 ID 存储在用户的 ParentId 中。下面是一个例子:

IEnumerable<UserProfile> users = new List<UserProfile>{
        new UserProfile(){Id = 1, ParentId = null,  Name = "Admin1", Role = "Admin" },
        new UserProfile(){Id = 2, ParentId = 1,  Name = "User2", Role = "Admin" },
        new UserProfile(){Id = 3, ParentId = 1,  Name = "User3", Role = "Admin" },
        new UserProfile(){Id = 3, ParentId = null,  Name = "Admin2", Role = "Admin" },
        new UserProfile(){Id = 4, ParentId = 3,  Name = "User4", Role = "Admin" },
        new UserProfile(){Id = 5, ParentId = null,  Name = "User5", Role = "Admin" },
        new UserProfile(){Id = 6, ParentId = 3,  Name = "User6", Role = "Admin" },
    };  

我需要重新排列此列表或创建另一个列表,以便它按特定顺序排列: 所有管理员及其用户:

  • Admin1(完整详细信息)
  • 用户2(完整详细信息)
  • 用户3(完整详细信息)
  • 用户5(完整详细信息)
  • Admin2(完整详细信息)
  • 用户4(完整详细信息)
  • 用户6(完整详细信息)

我尝试先将它们分开,但我不知道如何按所需的顺序合并它们。

var adminsOnly = users.Where(p => p.Role.Equals("Admin")).OrderBy(p => p.Id);
var usersOnly = users.Where(p => p.Role.Equals("User")).OrderBy(p => p.Id);

非常感谢。

注意:可以有没有管理员的用户,也可以有没有用户的管理员。

最佳答案

var users = users.OrderBy(p => p.ParentId ?? p.Id).ThenBy(p => p.Role);

关于c# - 如何构建这个 LINQ 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13275694/

相关文章:

c# - WPF:在 TextBox 具有焦点时为 ListBox 设置 IsSelected,而不会在 LostFocus 上丢失选择

c# - EntityFramework 和 IoC 接口(interface)在洋葱架构中属于什么位置?

c# - ToList()——它会创建一个新列表吗?

c# - 为什么 ExpandoObject 在 Guid 转换为字符串后无法正常工作?

c# - 我可以使用 foreach 只返回集合中的特定类型吗?

c# - ASP.NET Identity 2在保存扩展应用程序用户时插入重复数据或保存两次

c# - 找到 INT 数组的第 N 个最大数的最快方法是什么?

c# - MVC View 中显示的 Linq 连接查询

Java 集合和比较器

collections - ArrayList(集合 c)VS HashSet(集合 c)