配列&コレクション

[C#] Containsメソッドの使い方 – 文字列や配列から値を検索する

Containsメソッドは、C#で文字列やコレクション(配列やリストなど)に特定の値が含まれているかを確認するために使用されます。

文字列の場合、string.Containsメソッドを使い、指定した部分文字列が含まれているかを判定します。

配列やリストの場合は、IEnumerable<T>.Containsメソッドを使い、指定した要素が存在するかを確認します。

戻り値はどちらもbool型で、含まれていればtrue、含まれていなければfalseを返します。

Containsメソッドとは

C#のContainsメソッドは、文字列や配列、リストなどのコレクションに特定の値が含まれているかどうかを確認するための便利なメソッドです。

文字列に対しては、部分文字列の存在をチェックすることができ、配列やリストに対しては、特定の要素が含まれているかを確認します。

このメソッドは、検索対象が大文字・小文字を区別するかどうかや、カスタムオブジェクトに対する比較方法など、さまざまな使い方が可能です。

特に、データのフィルタリングや条件に基づく処理を行う際に非常に役立ちます。

C#のコレクション操作において、Containsメソッドは基本的かつ重要な機能の一つです。

文字列に対するContainsメソッドの使い方

string.Containsメソッドの基本

C#のstringクラスには、Containsメソッドが用意されており、特定の部分文字列が文字列内に存在するかどうかを確認します。

このメソッドは、真偽値trueまたはfalseを返します。

基本的な使い方は以下の通りです。

string text = "こんにちは、世界!";
bool containsHello = text.Contains("こんにちは"); // true

大文字・小文字の区別

Containsメソッドは、大文字と小文字を区別します。

つまり、同じ文字列でも大文字と小文字が異なる場合、結果はfalseになります。

string text = "Hello, World!";
bool containsHello = text.Contains("hello"); // false

部分一致の確認

Containsメソッドは、部分一致を確認するために使用されます。

文字列の一部が一致するかどうかを調べることができ、特定のフレーズや単語が含まれているかを簡単にチェックできます。

string text = "C#プログラミングは楽しいです。";
bool containsProgramming = text.Contains("プログラミング"); // true

空文字列に対する挙動

空文字列("")に対してContainsメソッドを使用すると、常にtrueが返されます。

これは、空文字列はすべての文字列の部分文字列と見なされるためです。

string text = "テスト";
bool containsEmpty = text.Contains(""); // true

文字列のContainsメソッドの例

以下は、Containsメソッドを使用した具体的な例です。

この例では、ユーザーからの入力に特定のキーワードが含まれているかを確認します。

using System;
class Program
{
    static void Main()
    {
        string userInput = "C#は素晴らしいプログラミング言語です。";
        bool containsCSharp = userInput.Contains("C#");
        
        Console.WriteLine(containsCSharp); // true
    }
}
true

このように、Containsメソッドを使うことで、文字列内に特定の部分文字列が含まれているかを簡単に確認できます。

配列やリストに対するContainsメソッドの使い方

IEnumerable<T>.Containsメソッドの基本

C#では、IEnumerable<T>インターフェースに定義されたContainsメソッドを使用して、コレクション内に特定の要素が含まれているかを確認できます。

このメソッドは、要素が存在する場合はtrueを、存在しない場合はfalseを返します。

基本的な使い方は以下の通りです。

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        bool containsThree = numbers.Contains(3); // true
    }
}

配列に対するContainsメソッドの使い方

配列に対してもContainsメソッドを使用することができます。

配列の要素が特定の値を含んでいるかを確認する際に便利です。

using System;
class Program
{
    static void Main()
    {
        int[] array = { 10, 20, 30, 40, 50 };
        bool containsTwenty = array.Contains(20); // true
    }
}

リストに対するContainsメソッドの使い方

リストに対しても同様にContainsメソッドを使用できます。

リストは動的にサイズを変更できるため、要素の存在確認に非常に便利です。

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        List<string> fruits = new List<string> { "りんご", "ばなな", "みかん" };
        bool containsBanana = fruits.Contains("ばなな"); // true
    }
}

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

カスタムオブジェクトに対してContainsメソッドを使用する場合、オブジェクトの比較方法を定義する必要があります。

Equalsメソッドをオーバーライドすることで、特定のプロパティに基づいて比較が行われます。

using System;
using System.Collections.Generic;
class Person
{
    public string Name { get; set; }
    public override bool Equals(object obj)
    {
        if (obj is Person other)
        {
            return this.Name == other.Name;
        }
        return false;
    }
    public override int GetHashCode()
    {
        return Name.GetHashCode();
    }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "太郎" },
            new Person { Name = "次郎" }
        };
        bool containsTaro = people.Contains(new Person { Name = "太郎" }); // true
    }
}

配列やリストのContainsメソッドの例

以下は、配列とリストの両方でContainsメソッドを使用した具体的な例です。

この例では、整数の配列と文字列のリストに対して、特定の値が含まれているかを確認します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };
        List<string> colors = new List<string> { "赤", "青", "緑" };
        bool containsThree = numbers.Contains(3); // true
        bool containsRed = colors.Contains("赤"); // true
        Console.WriteLine(containsThree); // true
        Console.WriteLine(containsRed); // true
    }
}
true
true

このように、Containsメソッドを使用することで、配列やリスト内に特定の要素が含まれているかを簡単に確認できます。

Containsメソッドのパフォーマンス

文字列検索におけるパフォーマンスの考慮

string.Containsメソッドは、文字列内で部分文字列を検索する際に、文字列の長さに依存した時間計算量を持ちます。

最悪の場合、O(n)の時間がかかることがあります。

これは、検索対象の文字列が長い場合や、部分文字列が文字列の末尾に位置する場合に特に顕著です。

したがって、頻繁に文字列検索を行う場合は、検索対象の文字列を事前に短縮したり、正規表現を使用することでパフォーマンスを向上させることができます。

配列やリスト検索におけるパフォーマンスの考慮

配列やリストに対するContainsメソッドも、要素数に依存したO(n)の時間計算量を持ちます。

これは、リストや配列の最初から最後まで要素を順に比較するためです。

特に、要素数が多い場合は、検索にかかる時間が増加します。

パフォーマンスを向上させるためには、リストをソートしてバイナリサーチを使用するか、ハッシュセットを利用してO(1)の時間で要素の存在を確認する方法が考えられます。

大規模データに対するContainsメソッドの影響

大規模データセットに対してContainsメソッドを使用する場合、パフォーマンスの影響が顕著になります。

特に、数百万件以上のデータを扱う場合、単純なリストや配列での検索は非常に遅くなる可能性があります。

このような場合、データ構造を見直し、例えば、HashSet<T>Dictionary<TKey, TValue>を使用することで、検索時間を大幅に短縮することができます。

これにより、データの存在確認が迅速に行えるようになります。

このように、Containsメソッドのパフォーマンスは、使用するデータ構造やデータの規模によって大きく変わるため、適切な選択が重要です。

応用例

複数の文字列を検索する方法

複数の文字列を同時に検索する場合、ContainsメソッドをループやLINQを使って組み合わせることができます。

以下の例では、複数のキーワードが含まれているかを確認します。

using System;
using System.Collections.Generic;
class Program
{
    static void Main()
    {
        string text = "C#は素晴らしいプログラミング言語です。";
        List<string> keywords = new List<string> { "C#", "プログラミング", "Python" };
        foreach (var keyword in keywords)
        {
            if (text.Contains(keyword))
            {
                Console.WriteLine($"'{keyword}' が含まれています。");
            }
        }
    }
}
'C#' が含まれています。
'プログラミング' が含まれています。

カスタム比較ロジックを使ったContainsメソッド

カスタムオブジェクトに対してContainsメソッドを使用する場合、特定のプロパティに基づいて比較を行うために、IEqualityComparer<T>を実装することができます。

以下の例では、PersonクラスNameプロパティを基に比較を行います。

using System;
using System.Collections.Generic;
class Person
{
    public string Name { get; set; }
}
class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        return x.Name == y.Name;
    }
    public int GetHashCode(Person obj)
    {
        return obj.Name.GetHashCode();
    }
}
class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "太郎" },
            new Person { Name = "次郎" }
        };
        bool containsTaro = people.Contains(new Person { Name = "太郎" }, new PersonComparer()); // true
        Console.WriteLine(containsTaro); // true
    }
}
true

LINQと組み合わせたContainsメソッドの活用

LINQを使用することで、Containsメソッドをより効果的に活用できます。

例えば、特定の条件を満たす要素をフィルタリングする際に、Whereメソッドと組み合わせて使用することができます。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<string> fruits = new List<string> { "りんご", "ばなな", "みかん", "ぶどう" };
        List<string> searchFruits = new List<string> { "ばなな", "ぶどう" };
        var result = fruits.Where(fruit => searchFruits.Contains(fruit)).ToList();
        Console.WriteLine(string.Join(", ", result)); // ばなな, ぶどう
    }
}
ばなな, ぶどう

Containsメソッドを使ったフィルタリング処理

Containsメソッドを使用して、特定の条件に基づいてデータをフィルタリングすることができます。

以下の例では、特定の文字列が含まれている要素のみを抽出します。

using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static void Main()
    {
        List<string> sentences = new List<string>
        {
            "C#は楽しい言語です。",
            "Javaは人気のある言語です。",
            "Pythonはデータサイエンスでよく使われます。"
        };
        var filteredSentences = sentences.Where(sentence => sentence.Contains("言語")).ToList();
        foreach (var sentence in filteredSentences)
        {
            Console.WriteLine(sentence);
        }
    }
}
C#は楽しい言語です。
Javaは人気のある言語です。

このように、Containsメソッドはさまざまな応用が可能であり、特にデータの検索やフィルタリングにおいて非常に便利です。

まとめ

この記事では、C#のContainsメソッドの基本的な使い方から、文字列や配列、リストに対する応用例まで幅広く解説しました。

特に、部分一致検索やカスタム比較ロジックを用いた方法、LINQとの組み合わせによる効率的なデータ処理についても触れました。

これを機に、Containsメソッドを活用して、より効果的なデータ検索やフィルタリングを行ってみてください。

関連記事

Back to top button