MRが楽しい

MRやVRについて学習したことを書き残す

System.LinqのOrderByとThenByを使ってリストの複数の要素を元にソートを行う

本日は C# の小ネタ枠です。
System.LinqのOrderByとThenByを使ってリストの複数の要素を元にソートを行う方法を記事にします。

OrderByとThenBy

System.Linq の OrderBy メソッドはリスト全体の要素を参照して昇順に並べ替えを行います。
並べ替えに使用する要素のキーを引数で指定できます。
learn.microsoft.com

因みに降順で並べ替えを行いたい場合は OrderByDescending を利用します。
learn.microsoft.com

System.Linq の ThenBy メソッドはシーケンス内の後続の要素を参照して昇順に並べ替えを行います。
learn.microsoft.com

因みに降順で並べ替えを行いたい場合は ThenByDescending を利用します。
learn.microsoft.com

OrderByとThenByを組み合わせることでリストの複数の要素でソートを行うことができます。

// 苗字と名前を持つリストデータを作成
var testDataList = new List<TestData>()
{
    new TestData() { FirstName = "Ziro", LastName = "Tanaka" },
    new TestData() { FirstName = "Itiro", LastName = "Suzuki" },
    new TestData() { FirstName = "Taro", LastName = "Tanaka" },
    new TestData() { FirstName = "Ziro", LastName = "Saito" },
};

// 苗字→名前の順で昇順に並び替えて表示
var orderByName = testDataList.OrderBy(data => data.LastName).ThenBy(data => data.FirstName);

実行結果

Saito Taro
Saito Ziro
Suzuki Itiro
Tanaka Taro
Tanaka Ziro

サンプルコード

以下のサンプルコードを作成しました。
テストデータに対して初めに苗字でソートを行い、さらに次の要素として名前でソートを行ってリストを作成します。
・OrderByThenByTest.cs

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

public class OrderByThenByTest : MonoBehaviour
{
    class TestData
    {
        // 名前
        public string FirstName { get; set; }
        
        // 苗字
        public string LastName { get; set; }
    }
    
    void Start()
    {
        var testDataList = new List<TestData>()
        {
            new TestData() { FirstName = "Ziro", LastName = "Tanaka" },
            new TestData() { FirstName = "Itiro", LastName = "Suzuki" },
            new TestData() { FirstName = "Taro", LastName = "Saito" },
            new TestData() { FirstName = "Taro", LastName = "Tanaka" },
            new TestData() { FirstName = "Ziro", LastName = "Saito" },
        };

        // リストをそのままの順番で表示
        Debug.Log($"original : {string.Join(",", testDataList.Select(data => $"{data.LastName}:{data.FirstName}"))}");

        // 苗字→名前の順で昇順に並び替えて表示
        var orderByName = testDataList.OrderBy(data => data.LastName).ThenBy(data => data.FirstName);
        
        Debug.Log($"orderByName : {string.Join(",", orderByName.Select(data => $"{data.LastName}:{data.FirstName}"))}");
    }
}