Si está utilizando .NET 4.0, se puede utilizar la clase Tuple
como en
var tuple = new Tuple<int, int>(17, 42);
var otherTuple = Tuple.Create(17, 42);
y
var list = new List<Tuple<int, int>>();
Tenga en cuenta que si vas a la ruta de la utilización de Tuple<int, int>
entonces necesitará para crear una implementación personalizada de IEqualityComparer<Tuple<TFirst, TSecond>>
para reflejar sus reglas de igualdad que (x, y)
se consideran igual a (y, x)
. A continuación, deberá pasar una instancia de este comparador al List<T>.Contains(T, IEqualityComparer<T>)
(aquí T
es Tuple<int, int>
para usted).
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();
}
}
De lo contrario, si usted no puede o no desea utilizar Tuple
, entonces tendrá que implementar un IEqualityComparer<Pair>
para su clase Pair
o anular Object.Equals
y 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();
}
}
y
class PairEqualityComparer : IEqualityComparer<Pair> {
// details elided
}
Si utiliza
list.Contains(pair);
entonces se usará Equals
y GetHashCode
pero si se utiliza
list.Contains(pair, new PairEqualityComparer);
entonces se usará PairEqualityComparer.Equals
y PairEqualityComparer.GetHashCode
. Tenga en cuenta que estos podrían ser ser diferentes a las implementaciones de Object.Equals
y Object.GetHashCode
.
Por último, si las pruebas de contención son algo que hará con frecuencia, entonces List
no es su mejor opción; debe usar una clase diseñada para ese fin como HashSet
.
tengo edité mi respuesta para reflejar su necesidad de que '(x, y)' se considere igual a '(y, x)'. – jason