2

我有一个看起来像这样的类:

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

每个 UserProfile 都是用户或管理员。每个用户可能是单个管理员的孩子,其 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);

非常感谢。

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

4

3 回答 3

3
var users = users.OrderBy(p => p.ParentId ?? p.Id).ThenBy(p => p.Role);
于 2012-11-07T18:25:08.137 回答
3

尝试这个:

users.Where(x => x.Role == "User" && x.ParentID == null)
     .Concat(users.Where(x => x.Role == "Admin")
                  .ToDictionary(x => x, 
                                x => users.Where(u => u.ParentId == x.Id));
                  .SelectMany(x => new[] {x.Key}.Concat(x.Value)));

这将为您提供IEnumerable<UserProfile>, 所有用户都列在他们的管理员之后,所有没有管理员的用户都列在最前面。

于 2012-11-07T18:28:10.887 回答
0

鉴于问题中的新信息,伊斯特恩的回答似乎是最好的。我看到的唯一缺点是没有管理员的用户将按他们的 ID 排序到列表中,不一定在开头或结尾。

于 2012-11-07T18:38:52.160 回答