如果您使用的是 .NET 4.0,则可以使用 Tuple 类,如
var tuple = new Tuple<int, int>(17, 42);
var otherTuple = Tuple.Create(17, 42);
和
var list = new List<Tuple<int, int>>();
请注意,如果您使用Tuple<int, int>,那么您将需要创建IEqualityComparer<Tuple<TFirst, TSecond>> 的自定义实现,以反映(x, y) 被视为等于(y, x) 的相等规则。然后,您必须将此比较器的一个实例传递给List<T>.Contains(T, IEqualityComparer<T>)(这里T 是Tuple<int, int>)。
class TupleAsUnorderedPairComparer : IEqualityComparer<Tuple<TFirst, TSecond>> {
public bool Equals(Tuple<TFirst, TSecond> x, Tuple<TFirst, TSecond> y) {
if(Object.ReferenceEquals(x, y)) {
return true;
}
if(x == null || y == null) {
return false;
}
return x.Item1 == y.Item1 && x.Item2 == y.Item2 ||
x.Item1 == y.Item2 && x.Item2 == y.Item1;
}
public int GetHashCode(Tuple<TFirst, TSecond> x) {
if(x == null) {
return 0;
}
return x.Item1.GetHashCode() ^ x.Item2.GetHashCode();
}
}
否则,如果您不能或不想使用Tuple,那么您将需要为您的Pair 类实现IEqualityComparer<Pair> 或覆盖Object.Equals 和Object.GetHashCode。
class Pair {
public int First { get; private set; }
public int Second { get; private set; }
public Pair(int first, int second) {
this.First = first;
this.Second = second;
}
public override bool Equals(object obj) {
if(Object.ReferenceEquals(this, obj)) {
return true;
}
Pair instance = obj as Pair;
if(instance == null) {
return false;
}
return this.First == instance.First && this.Second == instance.Second ||
this.First == instance.Second && this.Second == instance.First;
}
public override int GetHashCode() {
return this.First.GetHashCode() ^ this.Second.GetHashCode();
}
}
和
class PairEqualityComparer : IEqualityComparer<Pair> {
// details elided
}
如果你使用
list.Contains(pair);
那么它将使用Equals 和GetHashCode 但如果你使用
list.Contains(pair, new PairEqualityComparer);
那么它将使用PairEqualityComparer.Equals 和PairEqualityComparer.GetHashCode。请注意,这些可能不同于您的 Object.Equals 和 Object.GetHashCode 的实现。
最后,如果你会经常进行收容测试,那么List 不是你最好的选择;您应该使用为此目的设计的类,例如 HashSet。