C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)

C#には LINQ というライブラリがあります。

LINQ を使えばコレクション(配列や List クラスなど)に対する処理を簡単に行う事が出来ます。

 

ここでは、LINQ を使って配列に格納された要素の中に特定の要素が存在するかを調べる方法について解説します。

LINQとは

LINQ は IEnumerable<T>インターフェースへの拡張メソッドとして作られています。

つまり、配列Listクラス、Dictionaryクラス、ObservableCollectionクラスなどのIEnumerable<T>インターフェースを実装するオブジェクトであればどれでも同じように使用する事ができます。

 

LINQをつかうには using で System.Linq を参照できるようにしておきましょう。

using System.Linq;

指定要素が存在するかを調べる Contains メソッド

指定要素があるかどうかを調べるには Contains メソッドを使用します。

メソッドの引数に指定した要素と一致する要素がある場合には true が、無い場合は false が返ります。

特定の要素が存在する場合にのみ処理する例

            string[] testArray = new string[5];
            testArray[0] = "Taro";
            testArray[1] = "Jiro";
            testArray[2] = "Saburo";
            testArray[3] = "Shiro";
            testArray[4] = "Goro";

            if (testArray.Contains("Jiro"))
            {
                Console.WriteLine("Jiroさんがいます");
            }

一致条件を独自のロジックにして存在の有無を調べる例

Contains メソッドは第2引数に IEqualityComparer インターフェースを渡す事が出来ます。IEqualityComparer インターフェースを実装したクラスを作成すれば一致条件を独自のロジックにする事も可能です。

    public class TestEqualityComparer : IEqualityComparer<string>
    {
        public bool Equals(string x, string y)
        {
            return (x.ToLower() == y.ToLower());
        }
        public int GetHashCode(string obj)
        {
            return obj.ToLower().GetHashCode();
        }
    }

上記の例では大文字・小文字を区別せずに一致するかを確認するクラスを作ってみました。

            string[] testArray = new string[5];
            testArray[0] = "Taro";
            testArray[1] = "Jiro";
            testArray[2] = "Saburo";
            testArray[3] = "Shiro";
            testArray[4] = "Goro";

            var ec = new TestEqualityComparer();
            if (testArray.Contains("JiRo", ec))
            {
                Console.WriteLine("Jiroさんがいます");
            }

似た機能をもつ Any メソッド

条件を指定して要素の有無を調べる場合には、Any メソッドを使う方法もあります。

Any メソッドではラムダ式で条件を記述できるので、IEqualityComparer インターフェースを使うより手軽です。

 

関連記事