[C# LINQ] データを昇順、降順に並び替える(OrderBy)

スポンサーリンク

データを昇順、降順で並び替える(OrderBy)

配列、コレクションのデータを昇順に並び替えるにはOrderByメソッドを、
降順に並び替えるにはOrderByDescendingメソッドを使います。

OrderByメソッドOrderByDescendingメソッドそれぞれの引数にはデータの並び替えに使用するキーを返すメソッドを指定します。ここにはラムダ式を使い匿名関数を渡します。
ラムダ式の使い方は、[C# 入門] 匿名関数(ラムダ式)の使い道を見てください。

キーを返すメソッドの引数配列、コレクションの要素のデータ型です。
戻り値並べ替えに使うキー(数値、文字列など)を返します。

LINQを使うには先頭に using System.Linq; が必要です。
サンプルではSampleDataクラスのData1をキーとして並び替えをしています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // SampleDataクラスのリストの宣言と初期化
        List<SampleData> list = new List<SampleData> {
            new SampleData { Data1 = 11, Data2 = 20, },
            new SampleData { Data1 = 12, Data2 = 20, },
            new SampleData { Data1 = 10, Data2 = 22, },
            new SampleData { Data1 = 10, Data2 = 21, },
            new SampleData { Data1 = 10, Data2 = 20, },
        };

        // 昇順ソート
        var order_list1 = list.OrderBy(d => d.Data1);
        Console.WriteLine("OrderByを使って昇順ソート(キーはData1)");
        foreach (var data in order_list1) Console.WriteLine($"data1={data.Data1}, data2={data.Data2}");

        // 降順ソート
        var order_list2 = list.OrderByDescending(d => d.Data1);
        Console.WriteLine("OrderByDescendingを使って降順ソート(キーはData1)");
        foreach (var data in order_list2) Console.WriteLine($"data1={data.Data1}, data2={data.Data2}");
    }
}

class SampleData
{
    public int Data1 { get; set; }
    public int Data2 { get; set; }
}

出力結果はこんな感じです。

OrderByを使って昇順ソート(キーはData1)
data1=10, data2=22
data1=10, data2=21
data1=10, data2=20
data1=11, data2=20
data1=12, data2=20
OrderByDescendingを使って降順ソート(キーはData1)
data1=12, data2=20
data1=11, data2=20
data1=10, data2=22
data1=10, data2=21
data1=10, data2=20
スポンサーリンク

複数キーで並び替える(OrderBy + ThenBy)

複数のキーを使って並べ替えをするには、OrderByメソッド、OrderByDescendingメソッドの後ろにThenByメソッドThenByDescendingメソッドをつなげて書きます。

昇順で並べる場合はThenByメソッド、降順で並べる場合はThenByDescendingメソッドを使います。

ThenByメソッド、ThenByDescendingメソッドもOrderByメソッドと同じく並び替えに使用するキーを返すメソッドを指定します。

OrderByで1つ目のキー、ThenByで2つ目のキーを指定する感じです。さらにThenByをつなげて、3つ目、4つ目と複数キーを指定することができます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    public static void Main()
    {
        // SampleDataクラスのリストの宣言と初期化
        List<SampleData> list = new List<SampleData> {
            new SampleData { Data1 = 11, Data2 = 20, },
            new SampleData { Data1 = 12, Data2 = 20, },
            new SampleData { Data1 = 10, Data2 = 22, },
            new SampleData { Data1 = 10, Data2 = 21, },
            new SampleData { Data1 = 10, Data2 = 20, },
        };

        // 複数キーでの並べ替え(Data1昇順、Data2昇順)
        var order_list3 = list.OrderBy(d => d.Data1).ThenBy(d => d.Data2);
        Console.WriteLine("OrderByでData1を昇順に並べた後でThenByでData2の昇順に並べる");
        foreach (var data in order_list3) Console.WriteLine($"data1={data.Data1}, data2={data.Data2}");

        // 複数キーでの並べ替え(Data1昇順、Data2降順)
        var order_list4 = list.OrderBy(d => d.Data1).ThenByDescending(d => d.Data2);
        Console.WriteLine("OrderByでData1を昇順に並べた後でThenByDescendingでData2の降順に並べる");
        foreach (var data in order_list4) Console.WriteLine($"data1={data.Data1}, data2={data.Data2}");
    }
}

class SampleData
{
    public int Data1 { get; set; }
    public int Data2 { get; set; }
}

処理結果はこんな感じです。

OrderByでData1を昇順に並べた後でThenByでData2の昇順に並べる
data1=10, data2=20
data1=10, data2=21
data1=10, data2=22
data1=11, data2=20
data1=12, data2=20
OrderByでData1を昇順に並べた後でThenByDescendingでData2の降順に並べる
data1=10, data2=22
data1=10, data2=21
data1=10, data2=20
data1=11, data2=20
data1=12, data2=20

C# プログラミング講座に戻る

コメント

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