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
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください