本日は 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}"))}"); } }