Home > C# > C# 学び直し > List<T>クラス

データを格納するクラスに、IEquatable<T>インターフェイスを実装する

新規作成日 2017-03-27
最終更新日

リスト内の項目を検索する、あるいは、項目同士を比較して、同じかどうか確認する操作は、頻繁に行います。

リストコンテナでは、重複した項目を登録することができます。しかし、重複のないリストが必要な場合もあります。その場合も項目が同じかどうかを比較する必要があります。

複数のデータメンバを持つクラスをリストコンテナで、このような操作を行うためには、データを格納するクラスに、IEquatable<T>インターフェイスを実装し、Equalsメソッドをオーバーライドする必要があります。

自分で作成したクラスのリストで活用するためには、使用する機能で必要なインターフェイスをクラスにあらかじめ実装しておく必要があります。

1つのデータメンバを持つクラスでは、特に何もする必要はありませんが、複数のデータメンバを持つクラスをリストコンテナに格納した場合、プログラム上で、項目が同じかどうか判断するには、Listで使用するクラスに、IEquatableインターフェイスを実装する必要があります。

C#の言語定義では、インターフェイスを実装する場合は、インターフェイスで定義したメソッドは全て実装する必要があると言われています。一方、.Net Freameworkで用意されているインターフェイスでは、必要なメソッドのみを定義して上書きすれば利用できます。

プログラムで必要なクラスをどのような構造にするかとともに、.Net Freameworkで用意されているインターフェイスを自分で作際したクラスに実装する作業は、C#を学ぶ際の小さな難所の1つです。しかし、視点や考え方、捉え方に関する問題なので、一度、理解してしまえば、理解できなかったことすら忘れてしまう程度の事です。そのため、ほとんどのC#の入門書では、.Net Freameworkで用意されている機能を適切に活用する領域に踏み込んでいません。

結果として、躓きやすいのです。この難所を乗り越えるためには、msdnで紹介されているサンプルコードを参考に理解していく必要があります。

ここで更にまた、小さいけれど無視できない難所があります。msdnの日本語訳を生成している翻訳エンジンは、この記事を書いている時点では、不思議な日本語を生成していることがあります。理解している人が利用する場合は、そのまま利用できるかも知れませんが、全く知らない内容であれば、英語で記述された原文を自分で訳して確認する必要がある場合が方が多いです。

URLの「ja-jp」の部分を「en-us」に変更すると原文で記載された記事にたどりつけます。ソースコード内から問題の本質を探し出し、理解するには、短いサンプルコードであっても、それができるようになるまでは、それなりの苦労が伴います。

リストクラス内に要素が存在するか確認するメソッド

List<T>のコレクション内には、指定された要素が存在するか確認するためのメソッドが存在します。

Exists メソッドと Contains メソッドは、比較した時の結果が、falseとtrueと異なる以外は同じです。使用例で紹介されているサンプルコードもほぼ同じです。

このメソッドを活用することで、重複のないリストを作成することができます。

重複のない配列やListを作成するには、2つの考え方があります。

  • 重複があるリストから、重複を削除する
  • リストに追加する際、同じ項目がある場合は、追加しない

リストを作成する際に予め重複する項目を追加しなければ、重複の存在しないリストが出来上がります。

項目を重複させないためには、リストが同じかどうかを判断する必要があります。

データメンバが1つの場合は、特別な操作をしなくてもC#が自動で判断してくれます。しかし、データメンバーが複数の場合は、必要な操作があります。

List<T>.Containsメソッドを使う際にオーバーライドする必要があるIEquatable<T>インターフェイスのメソッド

要素がリストに存在するかを確認するList<T>.Containsメソッドは、IEquatable<T>インターフェイスのメソッドを利用しています。そのため、自分で作成したクラスで利用するためには、必要なメソッドをオーバーライドする必要があります。

  • Equalsメソッド 同じかどうか比較する方法を指定します。引数ごとにメソッドを用意します。リストコンテナに格納するクラス・メンバが1つであれば、特に何も行う必要はありませんが、複数である場合、どのデータメンバーをどのように比較するかを示す必要があります。
  • GetHashCodeメソッド ハッシュコードを生成するメソッドです。それぞれの要素に、一意の識別子を用意して、同じかどうかの判別を簡略化するための仕組みです。違う要素に同じハッシュコードが重複して指定されなければ問題ありません。また、同じハッシュコードが重複して指定されても、多少動作が遅くなる可能性があるだけだと思われます。
  • ToStringメソッド 文字列型に変換するメソッドです。List.Containsメソッドとは、直接の関係はありませんが、指定しておいたほうが良いメソッドです。

msdnのIEquatableインターフェイスを使用する使用例

msdnでは、多くの使用例が提供されています。関連する使用例を見つけたら、わからなくなったときにすぐに探せるように整理しておくことをお勧めします。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」