C# リストで複数キーを指定したソート方法

システムオペレーション部のS666です。
あるプロジェクトで複数項目からなるListをランキング形式で出力したいとの話がありました。
リストの項目(1)が降順、項目(2)が昇順、項目(3)が昇順にしてほしいとのこと。。。
調べてみると、IOrderedEnumerableというインターフェイスがありました。
今回の「項目(1)が降順、項目(2)が昇順、項目(3)が昇順」を例にするとこのように記述ができます。
class Program
{
static void Main(string[] args)
{
List<Test1> list = new List<Test1>(new Test1[] {
new Test1(0, "b", 3, 1),
new Test1(1, "d", 1, 2),
new Test1(0, "a", 2, 3),
new Test1(1, "c", 2, 4),
new Test1(0, "e", 1, 5),
});
// Flagを降順、strIDを昇順、IDを昇順として並べ替える
IOrderedEnumerable<Test1> sortList =
list.OrderByDescending(rec => rec.Flag).ThenBy(rec => rec.strID).ThenBy(rec => rec.ID);
foreach (Test1 rec in sortList)
{
Console.WriteLine("{0},{1},{2},{3}", rec.Flag, rec.strID, rec.ID, rec.Rank);
}
}
}
class Test1
{
public int Flag;
public int ID;
public string strID;
public int Rank;
public Test1(int flag, string strId, int id, int rank)
{
this.Flag = flag;
this.ID = id;
this.strID = strId;
this.Rank = rank;
}
}
使用したメソッドを調べるとこのようになっています。
| OrderBy | シーケンスの要素をキーに従って昇順に並べ替えます。 |
|---|---|
| OrderByDescending | シーケンスの要素をキーに従って降順に並べ替えます。 |
| ThenBy | キーに従って昇順のシーケンス内の要素の後続の並べ替えを実行します。 |
| ThenByDescending | キーに従って降順に並べ替え、シーケンス内の要素の後続の並べ替えを実行します。 |
ちなみに「項目(1)が昇順、項目(2)が降順、項目(3)が降順」の場合はこのような記述です。
// Flagを昇順、strIDを降順、IDを降順として並べ替える
IOrderedEnumerable<Test1> sortList =
list.OrderBy(rec => rec.Flag).ThenByDescending(rec => rec.strID).ThenByDescending(rec => rec.ID);
なお、これらは遅延実行されるため、戻り値(今回の場合はsortList)に対してforeach等で列挙操作を行うまではソートされないそうです。
みなさん、ご参考にいかがでしょうか。
