自作クラスの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の話?)
コメント