【C#】Containsを自作クラスに適用する

自作クラスのListを作成し、Containsを使いたかったときに使用した方法です。


//自作クラス
public class NodePair {
	public Node n1;
	public Node n2;

	public NodePair(Node n1, Node n2){
		this.n1 = n1;
		this.n2 = n2;
	}
}

//比較用クラス
public class CompareNodePair : IEqualityComparer{
    public bool Equals(NodePair p1, NodePair p2){
        if (Object.ReferenceEquals(p1, p2)) return true;

        if(p1.n1 == p2.n1 && p1.n2 == p2.n2) return true;
	else if(p1.n1 == p2.n2 && p1.n2 == p2.n1) return true;
	else return false;
    }

    public int GetHashCode(NodePair p){
        int hash1 = p.n1.GetHashCode();
        int hash2 = p.n2.GetHashCode();

        return hash1 ^ hash2;
    }
}

//Containsを利用
nodeList.Contains(new NodePair(node1, node2), new CompareNodePair());

比較用クラスとして、IEqualityComparer<自作クラス>を継承したクラスを作成します。
その中に2つの自作クラスのオブジェクトが等しくなる条件を定義します。

あとはContainsの第2引数に比較用クラスのインスタンスを渡せば良いのですが、普通のList.Contains()では引数は1つしか持てません。
なので、Linqをインポートするのを忘れずに。

using System.Linq;

以上です。

検索してみるとEqualsのオーバーロードだとかも出てきましたが、そこらへんはよく分かりませんでした。(Javaの話?)

コメント