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(詳細)
  • User2(詳細)
  • User3(詳細)
  • User5(詳細)
  • Admin2(詳細)
  • User4(詳細)
  • User6(詳細)

最初にそれらを分離しようとしましたが、希望の順序でそれらをマージする方法がわかりません。

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

これを試して:

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 に答える
3
var users = users.OrderBy(p => p.ParentId ?? p.Id).ThenBy(p => p.Role);
于 2012-11-07T18:25:08.137 に答える
0

質問の新しい情報に照らして、Istern の回答が最良のようです。私が見る唯一の欠点は、管理者のいないユーザーが ID によってリストに並べ替えられることです。必ずしも先頭または末尾にあるとは限りません。

于 2012-11-07T18:38:52.160 に答える