【C#】LINQのOrderBy,OrderByDescending,ThenBy,ThenByDescendingの使い方

LINQとは

LINQ、ラムダ式に関しては下記の記事を参考ください。

【C#】LINQ

2021.02.21

【C#】ラムダ式

2021.02.21

今回は、LINQのOrderBy・OrderByDescending・ThenBy・ThenByDescendingについて解説していきます。

 

Enumerable.OrderBy メソッド

OrderByメソッドは、配列・シーケンスの要素を昇順に並べ替えることができます

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.orderby?view=net-5.0

 

OrderByのサンプルコード

using System;
using System.Collections.Generic;
using System.Linq; // usingに追加

namespace c_linq_orderby
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = new List() { 1, 2, 3, 4, 5 };

            IOrderedEnumerable orderNumber = number.OrderBy(x => x); // OrderByメソッド

            foreach (int num in orderNumber)
            {
                Console.WriteLine(num);
            }
        }
    }
}

実行結果:

1
2
3
4
5

OrderByメソッドの戻り値は、「IOrderedEnumerable<T> (IEnumerable<T>の派生クラス)」です。

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.iorderedenumerable-1?view=net-5.0

IEnumerable<T>はそのままforeach文で使用することができます。

 

Enumerable.OrderByDescending メソッド

OrderByDescending メソッドは、配列・シーケンスの要素を降順に並べ替えることができます

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.orderbydescending?redirectedfrom=MSDN&view=net-5.0#System_Linq_Enumerable_OrderByDescending__2_System_Collections_Generic_IEnumerable___0__System_Func___0___1__

 

OrderByDescendingのサンプルコード

コードは先ほどOrderbyメソッドで使用したものと同様です。

using System;
using System.Collections.Generic;
using System.Linq;

namespace c_linq_orderby
{
    class Program
    {
        static void Main(string[] args)
        {
            var number = new List() { 1, 2, 3, 4, 5 };

            IOrderedEnumerable orderNumber = number.OrderByDescending(x => x); // OrderByDescendingメソッドで降順に 

            foreach (int num in orderNumber)
            {
                Console.WriteLine(num);
            }
        }
    }
}

実行結果:

5
4
3
2
1

 

Enumerable.ThenBy メソッド

OrderByメソッドもしくはOrderByDescendingメソッドで昇順・降順に並び替えた後、さらに条件を追加して並び替えを行いたい場合には、ThenByメソッド・ThenByDescendingメソッドを使用します

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.thenby?redirectedfrom=MSDN&view=net-5.0#System_Linq_Enumerable_ThenBy__2_System_Linq_IOrderedEnumerable___0__System_Func___0___1__

ただし、注意点としてThenByメソッド・ThenByDescendingメソッドは、OrderByもしくはOrderByDescendingを使用した際に返される「IOrderedEnumerable」に対して使用するメソッドです。

そのため、単独で使用するとエラーになってしまうので、注意する必要があります。

 

ThenByのサンプルコード

昇順にする場合には、ThenByメソッドを使用します

using System;
using System.Collections.Generic;
using System.Linq;

namespace c_linq_thenby
{
    class Program
    {
        static void Main(string[] args)
        {
            var colors = new List() { "white", "red", "black", "yellow", "blue", "pink", "green"};

            IOrderedEnumerable orderColors = colors.OrderBy(x => x.Length); // 文字列の長さで昇順に並び替え

            IOrderedEnumerable thenByColors = orderColors.ThenBy(y => y); // 同じ長さのものはアルファベッドの昇順で並べ替え

            foreach (string color in thenByColors)
            {
                Console.WriteLine(color);
            }

        }
    }
}

実行結果:

red
blue
pink
black
green
white
yellow

 

Enumerable.ThenByDescending メソッド

降順にする場合には、ThenByDescendingメソッドを使用します

ThenByメソッドと同様、単独で使用するとエラーになってしまうので、注意する必要があります。

■公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.thenbydescending?redirectedfrom=MSDN&view=net-5.0#System_Linq_Enumerable_ThenByDescending__2_System_Linq_IOrderedEnumerable___0__System_Func___0___1__

 

ThenByDescendingのサンプルコード

コードは先程、ThenByメソッドで使用したものと同様のものです。

using System;
using System.Collections.Generic;
using System.Linq;

namespace c_linq_thenby
{
    class Program
    {
        static void Main(string[] args)
        {
            var colors = new List() { "white", "red", "black", "yellow", "blue", "pink", "green"};

            IOrderedEnumerable orderColors = colors.OrderBy(x => x.Length); // 文字列の長さで昇順に並び替え

            IOrderedEnumerable thenByDescendingColors = orderColors.ThenByDescending(y => y); // 同じ長さのものはアルファベッドの降順で並べ替え

            foreach (string color in thenByDescendingColors)
            {
                Console.WriteLine(color);
            }

        }
    }
}

実行結果:

red
pink
blue
white
green
black
yellow

 

まとめ

以下がOrderBy・OrderByDescending・ThenBy・ThenByDescendingをまとめたものになります。

 

メソッド名 説明
OrderBy 要素を昇順に並べ替える
OrderByDescending 要素を降順に並べ替える
ThenBy 要素を昇順に並べ替える
<前提条件>
・単独での使用は不可
ThenByDescending 要素を降順に並べ替える
<前提条件>
・単独での使用は不可

 

おすすめ・参考書籍

■C#を学習し始めた方向け
やさしいC 第3版 (「やさしい」シリーズ)

1週間でCの基礎が学べる本

確かな力が身につくC「超」入門 第2版 (Informatics&IDEA)

■C#をある程度学習した方向け
基礎からしっかり学ぶCの教科書 改訂新版 (マイクロソフト関連書)

独習C 新版

Effective C 6.0/7.0