【Unity】クラス同士の比較を行いたいときに IEquatableを使う

とあるデータクラスを作ったときに、その中身が同じかどうかを比較をしたい場合にIEquatableを使って比較するのが良いと教わったので、実装をしてみました。

IEquatable

このインターフェイスは等価かどうかを判断するEqualsが定義されています。 継承したクラスではEqualsを使って判定を行います。

 public interface IEquatable<T>
  {
       bool Equals(T other);
  }

docs.microsoft.com

実装

たとえば次のような情報のデータクラスがあるとします。

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を使っているのでそれを踏襲した形で対応をしました。