switch文のwhen
#switch
#when
#case
更新: 2026-02-06
意味と仕組み
1. キーワードは when: C# 7.0 以降で導入されたパターンマッチングの一環として、case ラベルの後ろに when を記述することで、値が一致し、かつ特定の条件を満たす場合のみ 処理を実行させることができます。
2. 実行順序: 通常の switch 文では値の一致のみを見ますが、when を使うと「型や値のチェック」→「when の条件評価」の順で判定されます。条件が false の場合は、その case は無視され、次の case の判定に移ります。
3. 変数の利用: 上記の例の case int i when ... のように、マッチした値を一時変数(ここでは i)に格納して、その変数を when 句の中で使うことができます。これにより、「数字である」かつ「偶数である」といった複合的な条件分岐をすっきりと記述できます。
Android開発などのJava経験者にとっては、if-else で記述していた複雑な条件分岐を switch 文だけで表現できるようになる便利な機能です。
var n = 15;
switch (n)
{
// n が 0 より大きく、かつ 2 で割り切れる場合
case int i when i > 0 && i % 2 == 0:
Console.WriteLine("正の偶数です");
break;
// n が 0 より大きく、かつ 2 で割り切れない(奇数)場合
case int i when i > 0 && i % 2 != 0:
Console.WriteLine("正の奇数です");
break;
// n が 0 の場合
case 0:
Console.WriteLine("ゼロです");
break;
// それ以外(負の数など)
default:
Console.WriteLine("負の数です");
break;
}
ポイント
配列 + LINQ(Where / Select / FirstOrDefault)
#LINQ
#配列
#Where
#Select
#FirstOrDefault
更新: 2026-02-06
配列は IEnumerable<T> を実装しているため、List<T> と同様に LINQ を使えます。
(注意:フィールドに var は使えないので、プロパティや明示型にします。)
using System;
using System.Linq; // LINQ を使うために必要
public class Sample {
// var name = ""; // エラー: var はフィールドには使えません
public string Name { get; set; } = ""; // string 型に変更
}
class Program {
static void Main() {
// 1. 配列の準備
Sample[] hairetsu = new Sample[3];
for (int i = 0; i < hairetsu.Length; i++) {
hairetsu[i] = new Sample { Name = "User_" + i };
}
// ------------------------------
// LINQ の使用例
// ------------------------------
// 例1: フィルタリング (Where)
// Name に "50" を含む要素だけを抽出する
var filteredItems = hairetsu.Where(item => item.Name.Contains("50"));
Console.WriteLine("--- フィルタリング結果 ---");
foreach (var item in filteredItems) {
Console.WriteLine(item.Name);
}
// 例2: データの変換/射影 (Select)
// Sample オブジェクトの配列から、Name(文字列)だけの配列を作る
string[] onlyNames = hairetsu
.Select(item => item.Name)
.ToArray(); // 結果を配列として確定させる
// 例3: 条件を満たす最初の要素を取得 (FirstOrDefault)
// Name が "User_99" の要素を探す
Sample? targetItem = hairetsu.FirstOrDefault(s => s.Name == "User_99");
if (targetItem != null) {
Console.WriteLine($"\n見つかったデータ: {targetItem.Name}");
}
}
}
ポイント
1) using System.Linq; が必要
2) Where/Select は遅延実行なので、foreach や ToArray() で確定する
3) 配列に戻すなら ToArray()