とあるデータクラスを作ったときに、その中身が同じかどうかを比較をしたい場合にIEquatableを使って比較するのが良いと教わったので、実装をしてみました。
IEquatable
このインターフェイスは等価かどうかを判断するEqualsが定義されています。 継承したクラスではEqualsを使って判定を行います。
public interface IEquatable<T> { bool Equals(T other); }
実装
たとえば次のような情報のデータクラスがあるとします。
public class HogeInfo : { public string Id {get; private set;} public int Value {get; private ser;} public HogeInfo(string id, int value) { Id = id; Value = value; } }
このクラスにIEquatableを使って等価判定用のメソッドを用意します。
public class HogeInfo : IEquatable<HogeInfo> { public string Id {get; private set;} public int Value {get; private ser;} public HogeInfo(string id, int value) { Id = id; Value = value; } public bool Equals(HogeInfo other) { if (other == null) { return false; } return Id.Equals(other.Id) && Value.Equals(other.Value); } }
比較する
実際に等価比較を行う場合に定義をしてEqualsを使います。
var info1 = new HogeInfo("hoge", 100); var info2 = new HogeInfo("hogehoge", 100); var info3 = new HogeInfo("hoge", 50); var info4 = new HogeInfo("hoge", 100); bool isEqual1 = info1.Equals(info2); // false bool isEqual2 = info1.Equals(info3); // false bool isEqual3 = info1.Equals(info4); // true
最後に
当初はIEquatableを使わずに専用の判定メソッドを用意していたのですが、C#の振る舞い的に等価判定はEqualsを使っているのでそれを踏襲した形で対応をしました。