全要素の条件判定
配列やリストなどのコレクションデータを検証する際、「リストに含まれる数値はすべて正の数か?」や「登録されているユーザーは全員有効なステータスか?」といった、すべての要素が特定の条件を満たしているかを確認したい場面は頻繁に発生します。
foreachループを使用してフラグ管理を行うことも可能ですが、C#のLINQ(Language Integrated Query)が提供するAllメソッドを使用すると、この判定ロジックを非常に簡潔に記述できます。
この記事では、Allメソッドの基本的な使い方から、オブジェクトのリストに対する検証、そして間違いやすい「空リスト」に対する挙動について解説します。
All メソッドの基本
Allメソッドは、引数として渡された条件式(述語)をコレクションの全要素に対して評価します。
trueを返す場合: すべての要素が条件を満たした場合。falseを返す場合: 条件を満たさない要素が少なくとも1つ存在した場合。
内部的には、条件を満たさない要素が見つかった時点で走査を打ち切り、即座にfalseを返します(ショートサーキット評価)。
コード例1:数値配列の検証
整数の配列に対し、すべての要素が「偶数」であるかどうかを判定する例です。
using System;
using System.Linq; // LINQを使用するために必須
public class AllBasicExample
{
public static void Main()
{
// 検証対象のデータ
int[] numbers = { 2, 4, 6, 8, 10 };
// 条件: すべての要素が偶数 (2で割り切れる) か?
bool isAllEven = numbers.All(n => n % 2 == 0);
if (isAllEven)
{
Console.WriteLine("すべての数値は偶数です。");
}
else
{
Console.WriteLine("奇数が含まれています。");
}
// 失敗するケース
int[] mixedNumbers = { 2, 4, 5, 8 };
bool result2 = mixedNumbers.All(n => n % 2 == 0);
Console.WriteLine($"mixedNumbers の結果: {result2}"); // False
}
}
出力結果:
すべての数値は偶数です。
mixedNumbers の結果: False
応用:オブジェクトリストの検証
Allメソッドは、オブジェクトのプロパティ値を基準とした一括チェックに非常に役立ちます。
コード例2:全員が合格点かチェックする
学生のテスト結果リストがあり、全員が合格点(例えば60点以上)を取っているかを確認するシナリオです。
using System;
using System.Collections.Generic;
using System.Linq;
// 学生クラス
public class Student
{
public string Name { get; set; }
public int Score { get; set; }
}
public class AllObjectExample
{
public static void Main()
{
var students = new List<Student>
{
new Student { Name = "Alice", Score = 85 },
new Student { Name = "Bob", Score = 72 },
new Student { Name = "Charlie", Score = 90 },
new Student { Name = "David", Score = 65 }
};
int passingScore = 60;
// 全員の Score が passingScore 以上であるか判定
bool allPassed = students.All(s => s.Score >= passingScore);
if (allPassed)
{
Console.WriteLine("クラス全員が合格しました!");
}
else
{
Console.WriteLine("不合格者が含まれています。");
}
}
}
出力結果:
クラス全員が合格しました!
重要な注意点:空のコレクションに対する挙動
Allメソッドを使用する際、最も誤解を生みやすいのが「コレクションが空(要素数0)」の場合の動作です。
論理学における「空虚な真(Vacuous Truth)」に基づき、空のコレクションに対してAllを実行すると、条件に関わらず常に true が返されます。
「要素が一つもないのだから、条件を満たすものはいない(False)」とはなりません。「条件に反する要素が一つもない」ため、Trueとなります。
using System;
using System.Linq;
using System.Collections.Generic;
public class EmptyAllExample
{
public static void Main()
{
var emptyList = new List<int>();
// リストは空だが、All は true を返す
// 条件 (n < 0) は関係ない
bool result = emptyList.All(n => n < 0);
Console.WriteLine($"空リストに対する All の結果: {result}");
}
}
出力結果:
空リストに対する All の結果: True
もし「データが存在し、かつ全員が条件を満たす」ことを確認したい場合は、Any()(データが存在するか)と組み合わせて判定する必要があります。
// データがあり、かつ全員が条件を満たす場合のみ true
bool validAndNotEmpty = list.Any() && list.All(x => x.IsValid);
まとめ
Allメソッドは、コレクションの整合性をチェックするための強力なメソッドです。
- 機能: すべての要素が条件を満たす場合に
trueを返します。 - 挙動: 条件を満たさない要素が見つかった時点で、走査を終了します(高速)。
- 注意: 空のリストに対しては常に
trueを返します。
対となるメソッドに「少なくとも1つが条件を満たすか」を判定する Any があります。これらを使い分けることで、コレクションの検証ロジックを簡潔に記述できます。
