【C#】ネスト構造のソート

システム開発
スポンサーリンク
スポンサーリンク

親子関係があるクラスで子クラスのデータに沿ってソートを行う方法!

📌 並び順の結果(クラスBBBのAAAプロパティで並べる)

A=Y, B=1, BBB.AAA=5,  BBB.BBB=10
A=X, B=3, BBB.AAA=5, BBB.BBB=31
A=Y, B=1, BBB.AAA=6,  BBB.BBB=11
A=Z, B=2, BBB.AAA=35, BBB.BBB=20
A=Z, B=2, BBB.AAA=36, BBB.BBB=21
A=Z, B=2, BBB.AAA=37, BBB.BBB=22
A=X, B=3, BBB.AAA=50, BBB.BBB=30

📌 データ構造

🔹クラス

class AAA
{
    public string A { get; set; }
    public int B { get; set; }
    public List<BBB> BBBList { get; set; } // 子オブジェクトのリスト
}

class BBB
{
    public string AAA { get; set; }
    public int BBB { get; set; }
}

🔹初期化

List<AAA> test = new List<AAA>
{
    new AAA
    {
        A = "X",
        B = 3,
        BBBList = new List<BBB>
        {
            new BBB { AAA = "50", BBB = 30 },
            new BBB { AAA = "5", BBB = 31 }
        }
    },
    new AAA
    {
        A = "Y",
        B = 1,
        BBBList = new List<BBB>
        {
            new BBB { AAA = "5", BBB = 10 },
            new BBB { AAA = "6", BBB = 11 }
        }
    },
    new AAA
    {
        A = "Z",
        B = 2,
        BBBList = new List<BBB>
        {
            new BBB { AAA = "35", BBB = 20 },
            new BBB { AAA = "36", BBB = 21 },
            new BBB { AAA = "37", BBB = 22 }
        }
    }
};

📌 ソート方法

var result = test
    .SelectMany(a => a.BBBList.Select(b => new
    {
        A = a.A,
        B = a.B,
        BBB_AAA = b.AAA,
        BBB_BBB = b.BBB
    }))
    .OrderBy(x => int.Parse(x.BBB_AAA)) // BBB.AAAがstring型なのでintに変換してソート
    .ToList();

// 出力
foreach (var item in result)
{
    Console.WriteLine($"A={item.A}, B={item.B}, BBB.AAA={item.BBB_AAA}, BBB.BBB={item.BBB_BBB}");
}

💡 ポイント

  • SelectMany を使うことで、List<AAA> をフラットに展開しつつ、親子関係の情報も保持できます。
  • BBB.AAAstring 型なので、数値的に正しく並べるために int.Parse() でソート時に変換しています。
  • OrderBy(x => x.BBB_AAA) のままだと文字列順(”10″ < “2” など)になるため注意。

システム開発
スポンサーリンク
tobotoboをフォローする

コメント

タイトルとURLをコピーしました