web-dev-qa-db-ja.com

複数のT.attributesでList <T>をソートするにはどうすればよいですか?

曲のリストがあるとしましょう。

Song {
    public string Name = "";
    public int PlayOrder = 0;
    }

次に、それらを最初に0から始まるPlayOrderで、次に名前でアルファベット順に並べ替えます。

したがって、ソートされた結果のサンプルセットは(Name、PlayOrder)になります。

/*
    Pachelbel's Canon, 0
    A Happy Song, 4
    Beethoven's 5th, 4
    Some Other Song, 7
*/

PlayOrder = 4がアルファベット順にどのように並んでいるかを確認してください。それが目的です。

現在、1つのフィールドでのみ並べ替えています。

List<Song> final = new List<Song>();

...

final.Sort((x, y) => x.PlayOrder.CompareTo(y.PlayOrder));

return final;

上記のように、名前で並べ替えることもできますか?

34
MetaGuru
return final.OrderBy(s => s.PlayOrder).ThenBy(s => s.Name);
60
Kris Ivanov

引き続き並べ替え方法を使用する場合は、比較関数をよりスマートにする必要があります。

final.Sort((x, y) => {
    var ret = x.PlayOrder.CompareTo(y.PlayOrder);
    if (ret == 0) ret = x.Name.CompareTo(y.Name);
    return ret;
});

LINQを使用する場合は、K Ivanovが投稿したものを使用できます。

32
tster

ソングclassを並べ替える方法が1つしかない場合は、IComparableまたは_IComparable<Song>_を実装する必要があります。

_List<Song> songs = GetSongs();
songs.Sort(); // Sorts the current list with the Comparable logic
_

リストを保存する方法が複数ある場合、_IEqualityComparer<T>_は実装するインターフェースです。次に、その比較子をList<T>Sort()の引数として提供できます。

1
Corniel Nobel