C#の配列の重複要素を削除する(LINQ Distinct)

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

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

 

ここでは、LINQ を使って配列に格納された要素の中で重複する要素を削除して1つにする方法について解説します。


LINQとは

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

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

 

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

using System.Linq;

重複要素を削除する Distinct メソッド

重複する要素を削除するには Distinct メソッドを使用します。

重複要素を削除する例

            string[] testArray = new string[12];
            testArray[0] = "Taro";
            testArray[1] = "Jiro";
            testArray[2] = "Jiro";
            testArray[3] = "Jiro";
            testArray[4] = "Saburo";
            testArray[5] = "Saburo";
            testArray[6] = "Shiro";
            testArray[7] = "Saburo";
            testArray[8] = "Shiro";
            testArray[9] = "Goro";
            testArray[10] = "Shiro";
            testArray[11] = "Goro";

            var testDistinct = testArray.Distinct();
            foreach (string item in testDistinct)
            {
                Console.WriteLine(item);
            }

結果は以下のようになります。

Taro
Jiro
Saburo
Shiro
Goro

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

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[12];
            testArray[0] = "Taro";
            testArray[1] = "JiRo";
            testArray[2] = "Jiro";
            testArray[3] = "Jiro";
            testArray[4] = "Saburo";
            testArray[5] = "SabUro";
            testArray[6] = "Shiro";
            testArray[7] = "Saburo";
            testArray[8] = "ShirO";
            testArray[9] = "Goro";
            testArray[10] = "Shiro";
            testArray[11] = "GORO";

            var ec = new TestEqualityComparer();
            var testDistinct = testArray.Distinct(ec);
            foreach (string item in testDistinct)
            {
                Console.WriteLine(item);
            }

結果は以下のようになります。

Taro
JiRo
Saburo
Shiro
Goro

 

関連記事