如何在列表中存储整数对? 我知道我可以为他们开设一个类,例如:
class Pair
{
int i1,i2;
}
但如果我这样做,我将无法使用 Contains
函数来检查给定的对是否在列表中。我该怎么做才能轻松地将整数存储在列表中并检查是否已经存在一对整数?我不能使用表格,因为不知道会有多少对。
编辑:
忘记添加:
在我的程序中,(x, y) 和 (y, x) 对被视为相等。
编辑:
(x,y) 和 (y,x) 在检查 Point
是否在列表中时相等,但 x
和 y
不能交换是因为 x
和 y
表示两点之间的连接(整数是点的 id,不,我不能使用任何引用等...)。当我检查 List
是否包含连接时,它是 (x,y) 还是 (y,x) 并不重要,但稍后我会需要该信息。
最佳答案
如果您使用的是 .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>>
的自定义实现反射(reflect)您的平等规则 (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
.
关于c# - 在列表中存储一对整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354596/