2017-12-27 12 views
0

私のAPIから返されるアカウントの配列は、次のデータ構造を持っています。内部配列のオブジェクトのプロパティに基づいて配列を並べ替える

Accounts[] accounts = [ 
    { 
     AccountNumber: 0000000001, 
     PrimaryPerson: Virginia, 
     PrimaryPersonNumber: 0001, 
     PersonRoleCode: "OWN", 
     PersonRoleDescription: "Owner", 
     RoleOrder: 1 
     PersonRoles: [ 
         { 
          AccountRoleCode: "CO", 
          AccountRoleDescription: "Co-Owner", 
          PersonName: "David", 
          PersonNumber: 0002, 
          RoleOrder: 2 
         }, 
         { 
          AccountRoleCode: "POA", 
          AccountRoleDescription: "Power of Attorney", 
          PersonName: "Clark", 
          PersonNumber: 0003, 
          RoleOrder: 6 
         } 
        ] 
    }, 
    { 
     AccountNumber: 0000000002, 
     PrimaryPerson: Clark, 
     PrimaryPersonNumber: 0003, 
     PersonRoleCode: "OWN", 
     PersonRoleDescription: "Owner", 
     RoleOrder: 1 
     PersonRoles: [ 
         { 
          AccountRoleCode: "CO", 
          AccountRoleDescription: "Co-Owner", 
          PersonName: "Virginia", 
          PersonNumber: 0001, 
          RoleOrder: 2 
         }, 
         { 
          AccountRoleCode: "POA", 
          AccountRoleDescription: "Power of Attorney", 
          PersonName: "David", 
          PersonNumber: 0002, 
          RoleOrder: 6 
         } 
        ] 
    }, 
    { 
     AccountNumber: 0000000003, 
     PrimaryPerson: David, 
     PrimaryPersonNumber: 0002, 
     PersonRoleCode: "OWN", 
     PersonRoleDescription: "Owner", 
     RoleOrder: 1 
     PersonRoles: [ 
         { 
          AccountRoleCode: "CO", 
          AccountRoleDescription: "Co-Owner", 
          PersonName: "Clark", 
          PersonNumber: 0003, 
          RoleOrder: 2 
         }, 
         { 
          AccountRoleCode: "CO", 
          AccountRoleDescription: "Co-Owner", 
          PersonName: "Virginia", 
          PersonNumber: 0001, 
          RoleOrder: 2 
         }, 
         { 
          AccountRoleCode: "POA", 
          AccountRoleDescription: "Power of Attorney", 
          PersonName: "Virginia", 
          PersonNumber: 0001, 
          RoleOrder: 6 
         } 
        ] 
    } 
]; 

私はAccountsオブジェクト自体のRoleOrder、および各PersonRoles[]指標でPersonRoleオブジェクトのRoleOrderに基づいて、このAccountsオブジェクトをソートする必要があります。

私はLINQでそれをしようとしましたが、なぜ正しく動作しないのか分かりません。

ここに私が試したことと、それが期待したことがあります。

IEnumberable<Account> sortedAccounts = accounts 
    .OrderBy(acct => acct.PersonRoles 
    .Where(role => role.PersNbr == 0001) 
    .Select(x => x.RoleOrder)).ToList(); 

それはPersNbrが所定PersNbr(0001)に等しく、RoleOrderでソートPersonRoles[]メインaccounts[]を注文することが期待。

基本的に私は特定の人のためにRoleOrderに基づいてaccounts[]をソートしたいと思います。だから、Virginiaに基づいてソート

Davidに基づいてソートすると、私は考えさせるれ、(順序は同じまま)何もしていない私はLINQのために持っているAccounts[] accounts = [0000000003, 0000000001, 0000000002]

になりますAccounts[] accounts = [0000000001, 0000000003, 0000000002]

になります私は正しい順序で質問をしています。

これを行うにはどうすればよいですか、それとも別のクエリに分割する必要がありますか?

答えて

1

私は完全な答えを提供するように求めてきた、ここで行く:

はまず、私はあなたが持っている「設計ホール」にあなたの注意を引くしたいと思います:あなたが持っていない場合、何が起こりますこの「人」はまったくですか?この場合、すべての結果が最後に表示されると仮定することができました。

問題について複雑な問題は、Account []配列ソート中と各アカウント内のPersonRoles配列内で2つの異なるソートを実行する必要があることに起因します。両方のソートが同じロジック。私たちは、「選択」の文からスタートした私たちは、それぞれの内部PersonRolesアレイの内部構造を並べ替える :

IEnumerable<Account> sortedAccounts = accounts 
      .Select(x => { 
       x.PersonRoles = x 
       .PersonRoles 
       .OrderBy(acct => { 
        if (acct.PersonNumber != 001) 
         return 999; 
        return acct.RoleOrder; 
       }).ToArray(); 
       return x; 
      }) 
      .OrderBy(acct => {     
       var relevantRoles = acct.PersonRoles 
        .Where(role => role.PersonNumber == 0001) 
        .Select(x => x.RoleOrder); 
       if (relevantRoles.Any() == false) 
        return 999; 
       return relevantRoles.Max(); 
       } 
      ).ToList(); 

説明:

あなたのオブジェクトが可変であると仮定すると、私は次の解決方法を推奨していますアカウントは、この方法は、それが明確だとアカウントがビットを注文実行するのに役立ちますシンプルな

その後、我々は

注同じロジックに従ってアカウントの配列を注文しているのistead」 return 999 "文を使用すると、PersonRoles配列内に関連ユーザーがいない場合に対処する他のロジックを記述できます。

+0

これは質問への回答を提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](/レビュー/低品質の投稿/ 18365520) – Rabbid76

1

参照:Sort a list and all its nested objects using Linq

あなたは1つのステートメントでそれを行うことができます。各LINQの内部では、外部ステートメントの情報を使用して新しいオブジェクトを作成する必要があります。

class Account 
{ 
    public int AccountNumber { get; set; } 
    public Role[] Roles { get; set; } 
} 

class Role 
{ 
    public string State { get; set; } 
    public int RoleOrder { get; set; } 
} 

Account[] accounts = new Account[3]; 
     accounts[0] = new Account { AccountNumber = 1, Roles = new 
Role[2] { new Role { State = "AK", RoleOrder = 2 }, new Role { State = 
"CO", RoleOrder = 1 } } }; 
     accounts[1] = new Account { AccountNumber = 3, Roles = new 
Role[2] { new Role { State = "NY", RoleOrder = 66 }, new Role { State = 
"FL", RoleOrder = 5 } } }; 
     accounts[2] = new Account { AccountNumber = 2, Roles = new 
Role[2] { new Role { State = "CA", RoleOrder = 9 }, new Role { State = 
"AZ", RoleOrder = 8 } } }; 

IEnumerable<Account> info = accounts 
    .Select(x => new Account { 
     AccountNumber = x.AccountNumber 
     , Roles = x.Roles.OrderBy(y => y.RoleOrder).ToArray() 
    } 
    ).Where(x => x.AccountNumber == 2); 
関連する問題