親子関係があるクラスで子クラスのデータに沿ってソートを行う方法!
📌 並び順の結果(クラス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.AAA
はstring
型なので、数値的に正しく並べるためにint.Parse()
でソート時に変換しています。OrderBy(x => x.BBB_AAA)
のままだと文字列順(”10″ < “2” など)になるため注意。
コメント