Если вы используете .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
, тогда вам нужно будет реализовать IEqualityComparer<Pair>
для вашего 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
.