読者です 読者をやめる 読者になる 読者になる

C#のObservableCollectionにおける要素の並べ替え方法

ストアアプリで良く使うObservableCollectionですが、
並べかえ機能が備わっていないようでやり方調べたところLINQを使うとうまくいくようです。
実際にやってみたのでメモ残します。


コレクションに入れるクラス作ります。
後で結果出力がわかりやすいようにToStringをオーバーライドしてますが、特に気にしないでください。

 class MyClass
{
    public int No { get; set; }
    public string Name { get; set; }
    public override string ToString()
    {
        return "No:" + No + ",Name:" + Name; 
    }
}



先ほど作ったクラスを作ってテストプログラム書いてみました。

//ObservableCollection作成
ObservableCollection<MyClass> myCollection = new ObservableCollection<MyClass>
{
    new MyClass(){No=1,Name="ひかり"},
    new MyClass(){No=2,Name="こだま"},
    new MyClass(){No=3,Name="のぞみ"}
};


Console.WriteLine("[そのまま出力]");           
foreach (MyClass c in myCollection){Console.WriteLine(c);}



Console.WriteLine("[名前順で並べ替えて出力]");           
//並べ替え
ObservableCollection<MyClass> orderedByName = 
    new ObservableCollection<MyClass>(myCollection.OrderBy(n => n.Name));
//出力
foreach (MyClass c in orderedByName){ Console.WriteLine(c);}



Console.WriteLine("[番号順で逆順で並べ替えて出力]");
//並べ替え
ObservableCollection<MyClass> orderedById = 
    new ObservableCollection<MyClass>(myCollection.OrderByDescending(n => n.No));
//出力
foreach (MyClass c in orderedById) { Console.WriteLine(c); }  


ちゃんと並び替えできてるようです。

[そのまま出力]
No:1,Name:ひかり
No:2,Name:こだま
No:3,Name:のぞみ
[名前順で並べ替えて出力]
No:2,Name:こだま
No:3,Name:のぞみ
No:1,Name:ひかり
[番号順で逆順で並べ替えて出力]
No:3,Name:のぞみ
No:2,Name:こだま
No:1,Name:ひかり