【C#】List型とLINQ(OrderByメソッド)

スポンサーリンク

LINQ(リンク)を使いこなす第2弾です。
要素を並び替えるするメソッドを紹介します。
OrderByメソッド / OrderByDescedingメソッドです。
この記事では、メソッド構文で紹介します。
クエリ構文は補足として最後に紹介しようと思います。

OrderByメソッド/OrderByDescedingメソッド

データソースを並び替える時に使用するOrderByメソッドとOrderByDescedingメソッドです。
サンプルを紹介していきます。

リストクラスに準備されているSortメソッドと類似しています。
Sortメソッドについては、下記記事を参考にしてください。
【C#】リスト型とラムダ式(Sort) | 育児パパの人生備忘録 (t19488sns.com)

昇順に並び替える(OrderByメソッド)

リストに登録した要素を昇順に並び替える』サンプルを紹介したいと思います。
メソッド構文で紹介します。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

//昇順に並び替える
Console.WriteLine("昇順に並び替える[OrderBy]");
List<int> lstSmpMethod = lstSample.OrderBy(x => x).ToList();
lstSmpMethod.ForEach(x =>Console.WriteLine(x));  //結果 1,2,4,8,16

注意)文字列には使えません。

降順に並び替える(OrderByDescedingメソッド)

リストに登録した要素を降順に並び替える』サンプルを紹介したいと思います。
メソッド構文で紹介します。

List<int> lstSample = new List<int> { 4, 16, 1, 2, 8 };

//降順に並び替える
Console.WriteLine("降順に並び替える[OrderByDescending]");
List<int> lstSmpMethod = lstSample.OrderByDescending(x => x).ToList();
lstSmpMethod.ForEach(x => Console.WriteLine(x)); //結果 16,8,4,2,1

注意)文字列の要素には使えません。

ThenByメソッド/ThenByDescendingメソッド

ここでは、『複数の項目に優先順位を決めて並び替える方法』を紹介します。

説明するよりも、作業の例えとして、エクセルで並び替えをしたことはありますか?
エクセルの並び替えでは下記の画面が出てきて、列ごとに優先順位を決めて並び替えを行います。

このように複数の項目に対して並び替えを行う時に優先順位を決める必要が出てきます。

昇順に並び替える(ThenByメソッド)

リストに登録した要素を昇順に並び替えた後に、次の要素を昇順に並び替える』サンプルを紹介したいと思います。
メソッド構文で紹介します。

サンプルでは、学校のクラスである年/組を構造体で定義します。

struct SchoolClass
{
    internal int Grade;    //年
    internal int ClassNo;  //組
}

リストで複数の適当なクラスを登録していきます。
そして、年で並び替えた後に、組で並び替えようと思います。

List<SchoolClass> lstSchool = new List<SchoolClass>
{
    new SchoolClass{ Grade=1, ClassNo=1 },  //1年1組
    new SchoolClass{ Grade=3, ClassNo=2 },  //3年2組
    new SchoolClass{ Grade=1, ClassNo=2 },  //1年2組
    new SchoolClass{ Grade=2, ClassNo=2 },  //2年2組
    new SchoolClass{ Grade=2, ClassNo=1 },  //2年1組
    new SchoolClass{ Grade=3, ClassNo=1 },  //3年1組
};

//昇順の後に昇順に並び替える
Console.WriteLine("昇順に並び替える[OrderBy/ThenBy]");
List<SchoolClass> lstSchoolClass2 = 
    lstSchool.OrderBy(x => x.Grade).ThenBy(x => x.ClassNo).ToList();
lstSchoolClass2.ForEach(x => Console.WriteLine(x.Grade + "年" + x.ClassNo + "組"));
//結果
//1年1組
//1年2組
//2年1組
//2年2組
//3年1組
//3年2組

昇順に並び替える(ThenByDescendingメソッド)

リストに登録した要素を昇順に並び替えた後に、次の要素を降順に並び替える』サンプルを紹介したいと思います。
メソッド構文で紹介します。
サンプルについては先ほどの学校のクラスを使います。(ここをクリック)

//昇順後に降順に並び替える
Console.WriteLine("昇順に並び替える[OrderBy/ThenByDescending]");
List<SchoolClass> lstSchoolClass4 =
    lstSchool.OrderBy(x => x.Grade).ThenByDescending(x => x.ClassNo).ToList();
lstSchoolClass4.ForEach(x => Console.WriteLine(x.Grade + "年" + x.ClassNo + "組"));
//結果
//1年2組
//1年1組
//2年2組
//2年1組
//3年2組
//3年1組

注意点[OrderBy()/OrderByDesceding()の後に使う事]

ThenByメソッドとThenByDescendingメソッドを使うにあたって、注意点があります。
それは、OrderBy()/OrderByDesceding()の次に使う事です。
仮に最初から[ThenByメソッド]を使った場合は、下記のようなエラーが発生します。

『’ThenBy’が見つかりません』というエラーが発生します。

まとめ

リストクラスに標準に準備されているSort()と類似しています。
LINQが好きな人は、[OrderByメソッド/OrderByDescedingメソッド]を使用するでしょう。

個人的には、 OrderByメソッドの方が、要素を指定するだけなので見やすい気がします。
また、項目(キー)に優先順位をつけてソートする手段が残っている事もメリットの1つだと思いました。

補足(クエリ構文で書いた場合)

//昇順に並び替える
Console.WriteLine("sampleQuery1[昇順]");
var sampleQuery1 = from x in lstSample
                   orderby x
                   select x;
foreach (var q in sampleQuery1) Console.WriteLine(q);   //結果:1,2,4,8,16

//降順に並び替える
Console.WriteLine("sampleQuery2[降順]");
var sampleQuery2 = from x in lstSample
                   orderby x descending
                   select x;
foreach (var q in sampleQuery2) Console.WriteLine(q);   //結果:16,8,4,2,1

//昇順の後に昇順にに並び替える
Console.WriteLine("sampleQuery3[昇順/昇順]");
var sampleQuery3 = from x in lstSchool
                   orderby x.Grade,x.ClassNo
                   select x;
foreach (var q in sampleQuery3) 
    Console.WriteLine(q.Grade + "年" + q.ClassNo + "組");
//結果
//1年1組
//1年2組
//2年1組
//2年2組
//3年1組
//3年2組

//昇順の後に降順に並び替える
Console.WriteLine("sampleQuery4[昇順/降順]");
var sampleQuery4 = from x in lstSchool
                   orderby x.Grade, x.ClassNo descending
                   select x;
foreach (var q in sampleQuery4)
    Console.WriteLine(q.Grade + "年" + q.ClassNo + "組");
//結果
//1年2組
//1年1組
//2年2組
//2年1組
//3年2組
//3年1組

メソッド構文とは若干違います。
クエリ構文では『ThenBy()/OrderByDesceding()』はありません
orderbyの後に優先順位の項目(キー)ごとにカンマで区切ります。
そして、降順にしたい場合は、項目(キー)を指定した後にdescendingを記載します。

おまけです。
降順の後に降順の場合、クエリ構文では下記のようになります。

//降順の後に降順に並び替える
Console.WriteLine("sampleQuery5[降順/降順]");
var sampleQuery5 = from x in lstSchool
                   orderby x.Grade descending, x.ClassNo descending
                   select x;
foreach (var q in sampleQuery5)
    Console.WriteLine(q.Grade + "年" + q.ClassNo + "組");
//結果
//3年2組
//3年1組
//2年2組
//2年1組
//1年2組
//1年1組

コメント

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