如何在列表中存储整数对?
我知道我可以为它们创建一个类,例如:
class Pair
{
int i1,i2;
}
但是如果我这样做,我将无法使用 Contains
函数来检查给定的对是否在列表中。我怎样才能做到这一点,以便我可以轻松地将整数存储在列表中并检查一对整数是否已经存在?我无法使用表格,因为不知道会有多少对。
编辑:
忘记补充:
在我的程序中, (x, y) 和 (y, x) 对被视为平等。
编辑:
检查 Point
是否在列表中时,(x,y) 和 (y,x) 相等,但 x
和 y
不能相等交换是因为 x
和 y
表示两点之间的连接(整数是点的 id,不,我不能使用任何引用等...)。当我检查 List
是否包含连接时,它是 (x,y) 还是 (y,x) 并不重要,但稍后我会需要该信息。
How can I store pairs of integers in a List?
I know I could make a class for them like:
class Pair
{
int i1,i2;
}
But if I do that I'm not able to use the Contains
function to check if a given pair is in the list. How can I do that so I can easily store integers in a List and check if a pair of integers already exists? I cannot use table because it is not known how many pairs there will be.
EDIT:
Forgot to add:
In my program pairs (x, y) and (y, x) are to be treated as equals.
EDIT:
(x,y) and (y,x) are equals while checking if Point
is in the list, but x
and y
can not be swapped because x
and y
represent a connection between two points (integer is id of point, and no I can't use any reference etc...). When I'm checking if List
contains a connection it is not important if it is (x,y) or (y,x) but later I would need that information.
发布评论
评论(4)
如果您使用的是 .NET 4.0,则可以使用
Tuple
类,如和
请注意,如果您采用使用
Tuple
的路线,那么您将需要创建IEqualityComparer>
的自定义实现,以反映(x, y)
被视为等于( y,x)。然后,您必须将此比较器的实例传递给
List.Contains(T, IEqualityComparer)
(此处T
是Tuple
为您服务)。否则,如果您不能或不想使用
Tuple
,那么您需要为您的Pair
实现IEqualityComparer
类或覆盖Object.Equals
和Object.GetHashCode
。如果
您使用
,那么它将使用
Equals
和GetHashCode
但如果您使用,那么它将使用
PairEqualityComparer.Equals
和PairEqualityComparer.GetHashCode
。请注意,这些可能与您的Object.Equals
和Object.GetHashCode
实现不同。最后,如果您经常进行遏制测试,那么
List
并不是您的最佳选择;您应该使用为此目的而设计的类,例如HashSet
。If you're using .NET 4.0, you could use the
Tuple
class as inand
Note that if you go the route of using
Tuple<int, int>
then you will need to create a custom implementation ofIEqualityComparer<Tuple<TFirst, TSecond>>
to reflect your equality rules that(x, y)
be considered equal to(y, x)
. You will then have to pass an instance of this comparer toList<T>.Contains(T, IEqualityComparer<T>)
(hereT
isTuple<int, int>
for you).Otherwise, if you can't or don't want to use
Tuple
then you will need to implement anIEqualityComparer<Pair>
for yourPair
class or overrideObject.Equals
andObject.GetHashCode
.and
If you use
then it will use
Equals
andGetHashCode
but if you usethen it will use
PairEqualityComparer.Equals
andPairEqualityComparer.GetHashCode
. Note that these could be different than your implementations ofObject.Equals
andObject.GetHashCode
.Finally, if testing for containment is something that you'll be doing often then a
List
is not your best bet; you should use a class designed for that purpose like aHashSet
.班级是你最好的选择。如果您执意使用
Contains
方法,则必须在 Pair 类中实现IComparable
接口。这将使您能够确定这对整数的“相等”含义。最简单的方法是创建现有的类,然后在
List
对象上创建和扩展方法。The class is your best bet. If you're dead set on using the
Contains
method, you'll have to implement theIComparable
interface in your Pair class. This will allow you to establish what "equality" means for this pair of integers.The simplest way would be to create the class as you have and then create and extension method on the
List<T>
object.另一种方法是使用
List
,通过将最大的数字放入高 32 位并将另一个数字放入低 32 位来填充它:Another way to do this would be to use a
List<ulong>
, populating it by putting the largest number in the upper 32 bits and the other number in the lower 32 bits:改为创建一个向量2 的列表。
将该列表视为一对整数。
哈基?也许吧,但实际上比上面所有的要简单得多。
Make a list of vector2's instead.
Treat that list as a pair of ints.
Hacky? Maybe, but much simpler than all of that above really.