Day 57 のゴールと全体像
Day 57 では、LINQ を使った「検索」と「並び替え」をテーマにします。 今日のキーワードは次の5つです。
- OrderBy
- OrderByDescending
- First
- FirstOrDefault
- Any
昨日の Day 56 で学んだ Where と Select は、 「絞り込み」と「変換」でした。
そこに今日の5つを組み合わせることで、
- 並び替える
- 先頭の1件を取り出す
- 条件に合うものが“あるかどうか”を調べる
といった、実務でもよく使う“検索系の処理”を、 とても読みやすいコードで書けるようになっていきます。
肩の力を抜いて、順番に見ていきましょう。
OrderBy ― 昇順に並び替える
OrderBy の役割
OrderBy は、
指定したキーをもとに、昇順(小さい順・辞書順)に並び替える
ためのメソッドです。
基本形のテンプレート
コレクション.OrderBy(x => 並び替えの基準)
C#x:1つずつ取り出される要素並び替えの基準:数値や文字列など、「比較できる値」
例1:数字を小さい順に並び替える
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 5, 1, 8, 3, 2 };
// 数字を昇順(小さい順)に並び替える
var ordered = numbers.OrderBy(n => n);
Console.WriteLine("昇順に並び替えた結果:");
foreach (var n in ordered)
{
Console.WriteLine(n);
}
}
}
C#コードのポイント
OrderBy(n => n)は「n 自身を基準に並び替える」という意味です。- 数字の場合は、そのまま
nを返せば「小さい順」に並びます。
例2:文字列を辞書順に並び替える
using System;
using System.Linq;
class Program
{
static void Main()
{
var names = new[] { "山田", "佐藤", "鈴木", "田中" };
// 名前を辞書順に並び替える
var orderedNames = names.OrderBy(name => name);
Console.WriteLine("名前を辞書順に並び替えた結果:");
foreach (var name in orderedNames)
{
Console.WriteLine(name);
}
}
}
C#文字列の場合も、 OrderBy(name => name) で「辞書順」に並び替えられます。
OrderByDescending ― 降順に並び替える
OrderByDescending の役割
OrderByDescending は、
指定したキーをもとに、降順(大きい順・逆順)に並び替える
ためのメソッドです。
基本形のテンプレート
コレクション.OrderByDescending(x => 並び替えの基準)
C#例1:数字を大きい順に並び替える
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 5, 1, 8, 3, 2 };
// 数字を降順(大きい順)に並び替える
var orderedDesc = numbers.OrderByDescending(n => n);
Console.WriteLine("降順に並び替えた結果:");
foreach (var n in orderedDesc)
{
Console.WriteLine(n);
}
}
}
C#例2:年齢の高い順にユーザーを並び替える
using System;
using System.Linq;
using System.Collections.Generic;
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 },
new User { Name = "鈴木一郎", Age = 30 }
};
// 年齢の高い順に並び替える
var orderedUsers = users.OrderByDescending(u => u.Age);
Console.WriteLine("年齢の高い順に並び替えた結果:");
foreach (var user in orderedUsers)
{
Console.WriteLine($"{user.Name} ({user.Age}歳)");
}
}
}
C#コードのポイント
OrderByDescending(u => u.Age)で、「Age プロパティ」を基準に降順に並び替えています。- オブジェクトのプロパティを基準にできるのが、LINQ の強みです。
First ― 先頭の1件を取り出す
First の役割
First は、
コレクションの先頭の要素を1件だけ取り出す
ためのメソッドです。
基本形のテンプレート
コレクション.First()
コレクション.First(x => 条件)
C#- 引数なし:単純に先頭の要素を返す
- 条件あり:条件に合うもののうち、最初の1件を返す
例1:単純に先頭の要素を取り出す
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 10, 20, 30 };
int first = numbers.First(); // 先頭の要素(10)を取得
Console.WriteLine($"先頭の要素は {first} です。");
}
}
C#例2:条件に合う最初の1件を取り出す
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 5, 12, 3, 18, 7 };
// 10より大きい数字のうち、最初の1件を取得
int firstOver10 = numbers.First(n => n > 10);
Console.WriteLine($"10より大きい数字のうち、最初の1件は {firstOver10} です。");
}
}
C#注意点:該当する要素がないと例外になる
First は、
- コレクションが空の場合
- 条件に合う要素が1つもない場合
に 例外(エラー) を投げます。
そのため、 「ないかもしれない」前提で書きたいときは、 次に紹介する FirstOrDefault を使うほうが安全です。
FirstOrDefault ― 見つからなければ「既定値」を返す
FirstOrDefault の役割
FirstOrDefault は、
条件に合う最初の1件を返す ただし、見つからなければ「既定値(default)」を返す
というメソッドです。
基本形のテンプレート
コレクション.FirstOrDefault()
コレクション.FirstOrDefault(x => 条件)
C#例1:条件に合うものがない場合の挙動
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 1, 2, 3 };
// 10より大きい数字は存在しない
int result = numbers.FirstOrDefault(n => n > 10);
Console.WriteLine($"結果は {result} です。");
}
}
C#この場合、
int型の既定値は0なので、resultには0が入ります。
例2:参照型(クラス)の場合
using System;
using System.Linq;
using System.Collections.Generic;
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 }
};
// 年齢が30以上のユーザーを探す(存在しない)
var user = users.FirstOrDefault(u => u.Age >= 30);
if (user == null)
{
Console.WriteLine("30歳以上のユーザーは見つかりませんでした。");
}
else
{
Console.WriteLine($"{user.Name} さんが見つかりました。");
}
}
}
C#コードのポイント
- 参照型(クラス)の既定値は
nullです。 FirstOrDefaultを使うときは、nullチェックをセットで書くのが基本パターンです。
Any ― 条件に合うものが「1つでもあるか」を調べる
Any の役割
Any は、
条件に合う要素が1つでも存在するかどうか
を調べるメソッドです。
基本形のテンプレート
コレクション.Any()
コレクション.Any(x => 条件)
C#- 引数なし:コレクションが空でなければ
true - 条件あり:条件に合うものが1つでもあれば
true
例1:コレクションが空かどうかを調べる
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new int[] { };
bool hasAny = numbers.Any();
Console.WriteLine(hasAny
? "要素があります。"
: "要素がありません。");
}
}
C#例2:条件に合うものがあるかどうかを調べる
using System;
using System.Linq;
class Program
{
static void Main()
{
var numbers = new[] { 1, 2, 3, 4, 5 };
// 偶数が1つでもあるかどうか
bool hasEven = numbers.Any(n => n % 2 == 0);
Console.WriteLine(hasEven
? "偶数が少なくとも1つあります。"
: "偶数は1つもありません。");
}
}
C#例3:ユーザー一覧から「未成年がいるか」を調べる
using System;
using System.Linq;
using System.Collections.Generic;
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 },
new User { Name = "鈴木一郎", Age = 30 }
};
bool hasMinor = users.Any(u => u.Age < 20);
Console.WriteLine(hasMinor
? "未成年のユーザーが含まれています。"
: "未成年のユーザーはいません。");
}
}
C#コードのポイント
Anyは「存在チェック」に使うメソッドです。- 実務では、バリデーションや条件分岐など、 さまざまな場面で頻繁に登場します。
検索・並び替えをまとめたミニテンプレート
最後に、今日学んだ5つをひとつにまとめた、 「LINQ 検索・並び替えテンプレート」を紹介します。
using System;
using System.Linq;
using System.Collections.Generic;
class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
var users = new List<User>
{
new User { Name = "山田太郎", Age = 25 },
new User { Name = "佐藤花子", Age = 17 },
new User { Name = "鈴木一郎", Age = 30 }
};
// 1. 年齢の昇順に並び替え
var orderedAsc = users.OrderBy(u => u.Age);
// 2. 年齢の降順に並び替え
var orderedDesc = users.OrderByDescending(u => u.Age);
// 3. 最初の大人(20歳以上)を取得(なければ例外)
var firstAdult = users.First(u => u.Age >= 20);
// 4. 最初の未成年(20歳未満)を取得(なければ null)
var firstMinor = users.FirstOrDefault(u => u.Age < 20);
// 5. 未成年が1人でもいるかどうか
bool hasMinor = users.Any(u => u.Age < 20);
Console.WriteLine("年齢の昇順:");
foreach (var u in orderedAsc)
{
Console.WriteLine($"{u.Name} ({u.Age}歳)");
}
Console.WriteLine();
Console.WriteLine("年齢の降順:");
foreach (var u in orderedDesc)
{
Console.WriteLine($"{u.Name} ({u.Age}歳)");
}
Console.WriteLine();
Console.WriteLine($"最初の大人: {firstAdult.Name} ({firstAdult.Age}歳)");
if (firstMinor != null)
{
Console.WriteLine($"最初の未成年: {firstMinor.Name} ({firstMinor.Age}歳)");
}
else
{
Console.WriteLine("未成年のユーザーは見つかりませんでした。");
}
Console.WriteLine(hasMinor
? "未成年のユーザーが含まれています。"
: "未成年のユーザーはいません。");
}
}
C#このテンプレートをベースに、
- 並び替えの基準を変えてみる
First/FirstOrDefaultの条件を変えてみるAnyの条件を変えてみる
といった小さな工夫を重ねていくと、 LINQ の検索・並び替えが、自然に手に馴染んでいきます。
Day 57 のまとめ
Day 57 では、
OrderByが「昇順に並び替える」メソッドであることOrderByDescendingが「降順に並び替える」メソッドであることFirstが「先頭の1件を取り出す」メソッドであり、 該当する要素がないと例外になることFirstOrDefaultが「見つからなければ既定値(値型なら 0、参照型なら null)を返す」メソッドであることAnyが「条件に合うものが1つでもあるかどうか」を調べるメソッドであること
を、具体的なコード例とともに学びました。
LINQ の検索・並び替えを使いこなせるようになると、
- データの一覧から「欲しいものだけ」をスマートに取り出せる
- 並び替えや存在チェックを、短く読みやすいコードで書ける
- 実務でよくある「一覧画面」「検索機能」の裏側が、ぐっと身近に感じられる
そんな感覚が少しずつ育っていきます。
ぜひ、
- 自分で配列やリストを用意して、並び替えや検索をいろいろ試してみる
- オブジェクトの一覧に対して、今日の5つを組み合わせてみる
といった小さな一歩を重ねながら、 LINQ の“検索・並び替えの心地よさ”を、自分のコードで味わっていっていただければうれしいです。
