【C#】LINQのAnyメソッド:要素の存在確認と条件判定を効率的に行う方法

目次

「少なくとも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 を使用することが推奨されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次