「少なくとも1つあるか」を判定する
コレクションを扱う処理において、「リストが空でないか確認したい」や「エラー状態のデータが1つでも含まれているか調べたい」といった、**存在確認(Existence Check)**を行う場面は頻繁に発生します。
Count() > 0 を使って要素数を数えて判定することも可能ですが、C#のLINQには、この目的のために最適化された Any メソッドが用意されています。
この記事では、Anyメソッドの2つの使い方(全要素の存在確認、条件付きの存在確認)と、パフォーマンス上のメリットについて解説します。
1. コレクションが空でないかを確認する (Any())
引数なしの Any() メソッドは、シーケンスに要素が1つでも含まれていれば true、空であれば false を返します。
コード例:メッセージリストの確認
受信したメッセージのリストが空でない場合にのみ、処理を実行する例です。
using System;
using System.Collections.Generic;
using System.Linq; // LINQを使用するために必須
public class AnyBasicExample
{
public static void Main()
{
// メッセージのリスト(空の状態)
var messages = new List<string>();
// 1. 空のリストに対する Any()
if (messages.Any())
{
Console.WriteLine($"メッセージが {messages.Count} 件あります。");
}
else
{
Console.WriteLine("メッセージはありません。");
}
// メッセージを追加
messages.Add("System Notice: Update available.");
// 2. 要素がある状態での Any()
if (messages.Any())
{
Console.WriteLine("新着メッセージがあります。");
}
}
}
出力結果:
メッセージはありません。
新着メッセージがあります。
2. 条件を満たす要素があるかを確認する (Any(predicate))
Any メソッドに引数として条件式(ラムダ式)を渡すと、条件に一致する要素が少なくとも1つ存在すれば true を返します。
All メソッドが「全員が条件を満たすか」をチェックするのに対し、Any は「誰か1人でも条件を満たすか」をチェックします。
コード例:在庫切れ商品の検知
商品リストの中に、「在庫(Stock)が 0」の商品が含まれているかを素早くチェックする例です。
using System;
using System.Collections.Generic;
using System.Linq;
// 商品クラス
public class ProductItem
{
public string Name { get; set; }
public int Price { get; set; }
public int Stock { get; set; }
}
public class AnyConditionExample
{
public static void Main()
{
var inventory = new List<ProductItem>
{
new ProductItem { Name = "Keyboard", Price = 5000, Stock = 10 },
new ProductItem { Name = "Mouse", Price = 3000, Stock = 0 }, // 在庫切れ
new ProductItem { Name = "Monitor", Price = 20000, Stock = 5 }
};
// 条件: 在庫が 0 の商品があるか?
bool hasOutOfStock = inventory.Any(p => p.Stock == 0);
if (hasOutOfStock)
{
Console.WriteLine("警告: 在庫切れの商品が含まれています。");
}
else
{
Console.WriteLine("すべての商品に在庫があります。");
}
// 条件: 30000円以上の高額商品があるか?
bool hasExpensiveItem = inventory.Any(p => p.Price >= 30000);
if (!hasExpensiveItem)
{
Console.WriteLine("30,000円以上の商品はありません。");
}
}
}
出力結果:
警告: 在庫切れの商品が含まれています。
30,000円以上の商品はありません。
Count() > 0 との違い(パフォーマンス)
「要素があるか」を確認するために list.Count() > 0 と書くコードを見かけますが、多くの場合、Any() の方がパフォーマンス面で優れています。
Count(): 全要素数を正確に知る必要があるため、シーケンスの最後まで走査します(List<T>などのプロパティを持つ型を除く、汎用的なIEnumerable<T>の場合)。Any(): 最初の1つが見つかった時点で即座にtrueを返して終了します。
特に、巨大なデータセットや、データベースへのクエリ(Entity Frameworkなど)に対して「存在チェック」を行う場合は、Any() を使用することで無駄な計算やデータ取得を防ぐことができます。
まとめ
Any メソッドは、コレクションの状態を素早く判定するための基本メソッドです。
Any(): リストが「空ではない」ことを確認します。Any(condition): 条件に合う要素が「1つでもある」ことを確認します。- メリット: 条件を満たす要素が見つかった時点で処理を終了するため、高速です。
「全部調べる(All)」必要はなく、「あるかどうかだけ知りたい」場合には、迷わず Any を使用することが推奨されます。
