C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
生徒
「LINQでデータを並び替える方法ってありますか?」
先生
「はい、LINQのOrderByメソッドを使えば、簡単にデータを並び替えることができますよ。」
生徒
「どうやって使うんですか?」
先生
「それでは、基本的な使い方から見ていきましょう!」
1. OrderByとは?
C#のLINQにあるOrderByは、データを昇順に並び替えるためのメソッドです。昇順とは、小さい値から大きい値へ、またはあいうえお順のように並べることを指します。例えば、数字なら1、2、3の順番、文字列なら「あ、い、う」の順番に整理されます。
OrderByを使うと、配列やリストなどのコレクションに入っているデータを、指定した条件で簡単に整理できます。プログラムでデータを扱うとき、見やすく並べることはとても大切です。
2. OrderByの基本的な使い方
まずは、数値の配列を並び替える簡単な例を見てみましょう。数値データを小さい順に並べるコードです。
using System;
using System.Linq;
class Program
{
static void Main()
{
int[] numbers = { 5, 2, 8, 1, 9, 3 };
var sortedNumbers = numbers.OrderBy(n => n);
foreach (var num in sortedNumbers)
{
Console.WriteLine(num);
}
}
}
実行結果は次のようになります。
1
2
3
5
8
9
このコードでは、バラバラに並んでいた数字が小さい順にきれいに整理されました。OrderBy(n => n)という部分が並び替えの指示を出している箇所です。
3. OrderByの書き方を詳しく解説
OrderByメソッドは、並び替えの基準を指定する必要があります。基本的な書き方は次の通りです。
var 結果 = データ.OrderBy(要素 => 並び替えの基準);
ここで使われている=>という記号は、ラムダ式と呼ばれるものです。ラムダ式は、簡単に言うと「このデータをどう処理するか」を短く書く方法です。n => nは「各要素nをそのまま使って並び替える」という意味になります。
数値の場合は数値の大きさで、文字列の場合はあいうえお順やアルファベット順で自動的に並び替えられます。
4. 文字列をOrderByで並び替える
次は、文字列のリストを五十音順に並び替えてみましょう。名前のリストを整理する例です。
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> fruits = new List<string> { "りんご", "バナナ", "みかん", "いちご" };
var sortedFruits = fruits.OrderBy(f => f);
foreach (var fruit in sortedFruits)
{
Console.WriteLine(fruit);
}
}
}
実行結果は次のようになります。
いちご
バナナ
みかん
りんご
文字列の場合も、OrderByを使うだけで自動的に五十音順に整理されます。カタカナやひらがなが混ざっていても、きちんと並び替えてくれます。
5. OrderByDescendingで降順に並び替える
今までは小さい順に並べてきましたが、逆に大きい順に並べたい場合もあります。そんなときはOrderByDescendingメソッドを使います。Descendingは「降順」という意味で、大きい値から小さい値へと並べることを指します。
using System;
using System.Linq;
class Program
{
static void Main()
{
int[] scores = { 85, 92, 78, 95, 88 };
var sortedScores = scores.OrderByDescending(s => s);
foreach (var score in sortedScores)
{
Console.WriteLine(score);
}
}
}
実行結果は次のようになります。
95
92
88
85
78
テストの点数などは、高い順に見たいことが多いですよね。そういった場合にOrderByDescendingが便利です。
6. オブジェクトのプロパティで並び替える
実際のプログラムでは、単純な数値や文字列だけでなく、複数の情報を持ったオブジェクトを扱うことが多いです。例えば、商品の情報には名前と価格があります。こういったオブジェクトも、特定のプロパティを基準に並び替えることができます。
using System;
using System.Linq;
using System.Collections.Generic;
class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
class Program
{
static void Main()
{
List<Product> products = new List<Product>
{
new Product { Name = "ノート", Price = 150 },
new Product { Name = "ペン", Price = 100 },
new Product { Name = "消しゴム", Price = 80 }
};
var sortedProducts = products.OrderBy(p => p.Price);
foreach (var product in sortedProducts)
{
Console.WriteLine($"{product.Name}: {product.Price}円");
}
}
}
実行結果は次のようになります。
消しゴム: 80円
ペン: 100円
ノート: 150円
この例では、OrderBy(p => p.Price)と書くことで、価格の安い順に商品を並び替えています。p.Priceという部分が「価格プロパティを基準にする」という指示になっています。
7. ThenByで複数の条件で並び替える
同じ値が複数ある場合、さらに別の条件で並び替えたいことがあります。例えば、価格が同じ商品があったら、名前順に並べるといった具合です。そんなときはThenByメソッドを使います。
using System;
using System.Linq;
using System.Collections.Generic;
class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
List<Student> students = new List<Student>
{
new Student { Name = "田中", Age = 20 },
new Student { Name = "佐藤", Age = 20 },
new Student { Name = "鈴木", Age = 19 }
};
var sortedStudents = students.OrderBy(s => s.Age).ThenBy(s => s.Name);
foreach (var student in sortedStudents)
{
Console.WriteLine($"{student.Name}: {student.Age}歳");
}
}
}
実行結果は次のようになります。
鈴木: 19歳
佐藤: 20歳
田中: 20歳
まず年齢で並び替えられ、同じ年齢の場合は名前順になっています。このように、OrderByとThenByを組み合わせることで、より細かい並び替えが可能になります。
8. ToListやToArrayで結果を保存する
OrderByの結果は、そのままでは一時的なものです。並び替えた結果を後で何度も使いたい場合は、ToList()やToArray()を使ってリストや配列に変換しておくと便利です。
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
int[] numbers = { 7, 3, 9, 1, 5 };
List<int> sortedList = numbers.OrderBy(n => n).ToList();
Console.WriteLine("並び替え後のリスト:");
foreach (var num in sortedList)
{
Console.WriteLine(num);
}
}
}
ToList()を使うことで、並び替えた結果がリストとして保存され、何度でも使えるようになります。プログラムの中で繰り返し参照する場合は、この方法を使いましょう。