LINQ

[C#/LINQ] ALLメソッドの使い方 – 全要素が条件を満たすか判定

C#のLINQにおけるAllメソッドは、コレクション内のすべての要素が指定した条件を満たすかどうかを判定するために使用されます。

Allメソッドは、条件を満たさない要素が1つでもあればfalseを返し、すべての要素が条件を満たす場合にtrueを返します。

例えば、numbers.All(n => n > 0)は、numbers内のすべての要素が正の数であるかを確認します。

コレクションが空の場合はtrueを返します。

ALLメソッドとは

C#のLINQ(Language Integrated Query)におけるALLメソッドは、コレクション内のすべての要素が指定した条件を満たすかどうかを判定するためのメソッドです。

このメソッドは、条件を満たす要素が1つでも存在しない場合にfalseを返し、すべての要素が条件を満たす場合にtrueを返します。

ALLメソッドは、特にデータの検証やフィルタリングに役立ちます。

例えば、数値のリストがすべて正の数であるかを確認したり、文字列のリストがすべて特定の長さ以上であるかをチェックする際に使用されます。

ALLメソッドは、LINQのクエリ構文やメソッド構文の両方で利用可能で、使い方によっては非常に強力なツールとなります。

これにより、データの整合性を保つための条件チェックを簡潔に行うことができます。

ALLメソッドの基本的な使い方

シンプルな条件での使用例

ALLメソッドを使って、コレクション内のすべての要素が特定の条件を満たすかどうかを確認するシンプルな例を見てみましょう。

以下のコードでは、整数のリストがすべて正の数であるかを判定しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        bool allPositive = numbers.All(n => n > 0); // すべての要素が正の数か確認
        
        Console.WriteLine(allPositive); // 結果を出力
    }
}
True

この例では、リスト内のすべての数が正であるため、trueが出力されます。

複数条件での使用例

次に、複数の条件を組み合わせてALLメソッドを使用する例を見てみましょう。

以下のコードでは、整数のリストがすべて偶数であり、かつ10未満であるかを確認しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 2, 4, 6, 8 };
        
        bool allEvenAndLessThanTen = numbers.All(n => n % 2 == 0 && n < 10); // 偶数かつ10未満か確認
        
        Console.WriteLine(allEvenAndLessThanTen); // 結果を出力
    }
}
True

この場合も、リスト内のすべての数が条件を満たしているため、trueが出力されます。

空のコレクションに対するALLメソッドの挙動

空のコレクションに対してALLメソッドを使用した場合、常にtrueが返されます。

これは、空のコレクションには条件を満たさない要素が存在しないためです。

以下のコードで確認できます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> emptyList = new List<int>();
        
        bool allConditionMet = emptyList.All(n => n > 0); // 空のリストに対する確認
        
        Console.WriteLine(allConditionMet); // 結果を出力
    }
}
True

このように、空のコレクションに対してALLメソッドを使用すると、条件を満たす要素がないため、trueが返されます。

ALLメソッドのパフォーマンスに関する注意点

ALLメソッドは、コレクションのすべての要素を評価するため、要素数が多い場合はパフォーマンスに影響を与える可能性があります。

特に、条件が複雑な場合や、コレクションが大きい場合は、処理時間が長くなることがあります。

以下の点に注意してください。

  • コレクションのサイズ: 大きなコレクションでは、評価に時間がかかる。
  • 条件の複雑さ: 複雑な条件を使用すると、評価にかかる時間が増加する。
  • 早期終了: ALLメソッドは、条件を満たさない要素が見つかった時点で評価を終了するため、最初の数要素で条件が満たされない場合は、パフォーマンスが向上する。

これらの点を考慮し、必要に応じて他のLINQメソッドと組み合わせて使用することが推奨されます。

ALLメソッドの実践例

数値のコレクションに対するALLメソッドの使用

数値のコレクションに対してALLメソッドを使用することで、特定の条件を満たすかどうかを簡単に確認できます。

以下の例では、整数のリストがすべて3の倍数であるかを判定しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 3, 6, 9, 12 };
        
        bool allMultiplesOfThree = numbers.All(n => n % 3 == 0); // すべての要素が3の倍数か確認
        
        Console.WriteLine(allMultiplesOfThree); // 結果を出力
    }
}
True

この例では、リスト内のすべての数が3の倍数であるため、trueが出力されます。

文字列のコレクションに対するALLメソッドの使用

文字列のコレクションに対してALLメソッドを使用することで、特定の条件を満たすかどうかを確認できます。

以下の例では、文字列のリストがすべて5文字以上であるかを判定しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<string> words = new List<string> { "apple", "banana", "cherry" };
        
        bool allLongerThanFour = words.All(word => word.Length >= 5); // すべての要素が5文字以上か確認
        
        Console.WriteLine(allLongerThanFour); // 結果を出力
    }
}
True

この場合、リスト内のすべての文字列が5文字以上であるため、trueが出力されます。

カスタムオブジェクトに対するALLメソッドの使用

カスタムオブジェクトのコレクションに対してALLメソッドを使用することも可能です。

以下の例では、Personクラスのリストがすべて成人(18歳以上)であるかを判定しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 18 }
        };
        
        bool allAdults = people.All(person => person.Age >= 18); // すべての要素が成人か確認
        
        Console.WriteLine(allAdults); // 結果を出力
    }
}
True

この例では、リスト内のすべての人が成人であるため、trueが出力されます。

ネストされたコレクションに対するALLメソッドの使用

ネストされたコレクションに対してALLメソッドを使用することもできます。

以下の例では、各クラスの学生がすべて合格(60点以上)であるかを判定しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Student
{
    public string Name { get; set; }
    public List<int> Scores { get; set; }
}
class Program
{
    static void Main()
    {
        List<Student> students = new List<Student>
        {
            new Student { Name = "Alice", Scores = new List<int> { 70, 80, 90 } },
            new Student { Name = "Bob", Scores = new List<int> { 60, 65, 70 } },
            new Student { Name = "Charlie", Scores = new List<int> { 50, 55, 60 } }
        };
        
        bool allPassed = students.All(student => student.Scores.All(score => score >= 60)); // すべての学生が合格か確認
        
        Console.WriteLine(allPassed); // 結果を出力
    }
}
False

この例では、Charlieのスコアが60未満であるため、falseが出力されます。

ネストされたコレクションに対してALLメソッドを使用することで、複雑な条件を簡潔に評価できます。

ALLメソッドの応用例

複雑な条件を組み合わせたALLメソッドの使用

ALLメソッドを使用して、複雑な条件を組み合わせることができます。

以下の例では、整数のリストがすべて偶数であり、かつその値が10未満であるかを確認しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 2, 4, 6, 8 };
        
        bool allEvenAndLessThanTen = numbers.All(n => n % 2 == 0 && n < 10); // 偶数かつ10未満か確認
        
        Console.WriteLine(allEvenAndLessThanTen); // 結果を出力
    }
}
True

この例では、リスト内のすべての数が偶数であり、かつ10未満であるため、trueが出力されます。

ALLメソッドと他のLINQメソッドの組み合わせ

ALLメソッドは、他のLINQメソッドと組み合わせて使用することで、より強力なデータ操作が可能になります。

以下の例では、特定の条件を満たす学生のリストから、すべての学生が合格しているかを確認しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Student
{
    public string Name { get; set; }
    public List<int> Scores { get; set; }
}
class Program
{
    static void Main()
    {
        List<Student> students = new List<Student>
        {
            new Student { Name = "Alice", Scores = new List<int> { 70, 80, 90 } },
            new Student { Name = "Bob", Scores = new List<int> { 60, 65, 70 } },
            new Student { Name = "Charlie", Scores = new List<int> { 50, 55, 60 } }
        };
        
        bool allPassed = students
            .Where(student => student.Scores.Count > 0) // スコアがある学生をフィルタリング
            .All(student => student.Scores.All(score => score >= 60)); // すべての学生が合格か確認
        
        Console.WriteLine(allPassed); // 結果を出力
    }
}
False

この例では、Charlieのスコアが60未満であるため、falseが出力されます。

ALLメソッドを使ったデータ検証

ALLメソッドは、データの検証にも役立ちます。

以下の例では、ユーザーの入力がすべて有効なメールアドレス形式であるかを確認しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
    static void Main()
    {
        List<string> emailAddresses = new List<string>
        {
            "user@example.com",
            "admin@example.com",
            "invalid-email"
        };
        
        bool allValidEmails = emailAddresses.All(email => 
            Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$")); // メールアドレスの形式を確認
        
        Console.WriteLine(allValidEmails); // 結果を出力
    }
}
False

この例では、リスト内の1つのメールアドレスが無効な形式であるため、falseが出力されます。

ALLメソッドを使ったフィルタリングの応用

ALLメソッドを使用して、特定の条件を満たす要素をフィルタリングすることも可能です。

以下の例では、特定の条件を満たす商品がすべて在庫ありであるかを確認しています。

using System;
using System.Collections.Generic;
using System.Linq;
class Product
{
    public string Name { get; set; }
    public bool InStock { get; set; }
}
class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "Laptop", InStock = true },
            new Product { Name = "Smartphone", InStock = true },
            new Product { Name = "Tablet", InStock = false }
        };
        
        bool allInStock = products
            .Where(product => product.Name.StartsWith("S")) // 名前が"S"で始まる商品をフィルタリング
            .All(product => product.InStock); // すべてのフィルタリングされた商品が在庫ありか確認
        
        Console.WriteLine(allInStock); // 結果を出力
    }
}
True

この例では、”Smartphone”は在庫ありで”Tablet”は在庫はないですが、Where区によって”Smartphone”のみに絞り込まれているため、最終的にはTrueが出力されます。

ALLメソッドを使うことで、条件に基づいたフィルタリングが簡単に行えます。

ALLメソッドと他のLINQメソッドの比較

ALLメソッドとANYメソッドの違い

ALLメソッドANYメソッドは、どちらもコレクション内の要素に対する条件を評価するためのLINQメソッドですが、返す結果が異なります。

  • ALLメソッド: コレクション内のすべての要素が指定した条件を満たす場合にtrueを返します。

1つでも条件を満たさない要素があればfalseを返します。

  • ANYメソッド: コレクション内のいずれかの要素が指定した条件を満たす場合にtrueを返します。

すべての要素が条件を満たさない場合はfalseを返します。

以下の例で、両者の違いを確認できます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        bool allEven = numbers.All(n => n % 2 == 0); // すべての要素が偶数か確認
        bool anyEven = numbers.Any(n => n % 2 == 0); // いずれかの要素が偶数か確認
        
        Console.WriteLine(allEven); // 結果: False
        Console.WriteLine(anyEven); // 結果: True
    }
}
False
True

ALLメソッドとWHEREメソッドの違い

ALLメソッドWHEREメソッドは、コレクション内の要素に対する条件を評価する点では似ていますが、目的と返す結果が異なります。

  • ALLメソッド: コレクション全体に対して条件を評価し、すべての要素が条件を満たすかどうかを判定します。

結果はtrueまたはfalseです。

  • WHEREメソッド: コレクション内の要素をフィルタリングし、指定した条件を満たす要素の新しいコレクションを返します。

条件を満たさない要素は除外されます。

以下の例で、両者の違いを確認できます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        bool allEven = numbers.All(n => n % 2 == 0); // すべての要素が偶数か確認
        var evenNumbers = numbers.Where(n => n % 2 == 0); // 偶数の要素をフィルタリング
        
        Console.WriteLine(allEven); // 結果: False
        Console.WriteLine(string.Join(", ", evenNumbers)); // 結果: 2, 4
    }
}
False
2, 4

ALLメソッドとCOUNTメソッドの違い

ALLメソッドCOUNTメソッドは、コレクション内の要素に対する条件を評価する点では異なりますが、結果の形式が異なります。

  • ALLメソッド: コレクション内のすべての要素が指定した条件を満たす場合にtrueを返し、1つでも条件を満たさない要素があればfalseを返します。
  • COUNTメソッド: コレクション内の要素の数をカウントし、指定した条件を満たす要素の数を返します。

条件を満たさない要素はカウントされません。

以下の例で、両者の違いを確認できます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        
        bool allEven = numbers.All(n => n % 2 == 0); // すべての要素が偶数か確認
        int evenCount = numbers.Count(n => n % 2 == 0); // 偶数の要素をカウント
        
        Console.WriteLine(allEven); // 結果: False
        Console.WriteLine(evenCount); // 結果: 2
    }
}
False
2

このように、ALLメソッドANYメソッドWHEREメソッドCOUNTメソッドはそれぞれ異なる目的と結果を持っており、状況に応じて使い分けることが重要です。

まとめ

この記事では、C#のLINQにおけるALLメソッドの基本的な使い方から応用例、他のLINQメソッドとの比較まで幅広く解説しました。

ALLメソッドは、コレクション内のすべての要素が特定の条件を満たすかどうかを判定するための強力なツールであり、さまざまなシナリオで活用できます。

今後は、ALLメソッドを使ってデータの検証やフィルタリングを行い、より効率的なプログラミングを実現してみてください。

関連記事

Back to top button