c#对于X和Y坐标是可比较的
本文关键字:可比较 坐标 对于 | 更新日期: 2023-09-27 18:13:11
假设我有一个List<Point>
,它存储了X和Y点的列表,但我希望这些点是有序的。假设我事先不知道X和Y值的定义域,那么我将使用long
,这对于我的目的来说已经足够大了。
在任何给定时刻,列表可以有非常多或非常少的点,这些点可能非常稀疏地分布,但我需要能够非常有效地检索和插入列表中存在的特定点。
在过去,我使用IComparable<>
和List.BinarySearch()
取得了很大的成功。不幸的是,我需要能够根据插入和检索X和Y值。
如果我提前知道X和Y的定义域,并且定义域足够小,那么我就可以把这些数字加在一起,其中一个数的定义域的次幂。这确保了没有冲突,我可以有效地检索/插入值。例如,如果X和Y都在0和9之间,那么我就可以在10 * X + Y
上进行比较。因为我所有的数据类型都是64位整数,所以我不能这样做。
在不限制域的情况下,是否有其他方法可以实现此功能?
一种肯定有效的方法是比较X.ToString("N19") + Y.ToString("N19"),但是这现在是字符串比较而不是数值比较,这将带来巨大的性能损失。
编辑:我需要"N19",因为否则(X = 1234, Y = 5)将解析为与(X = 1, Y = 2345)相同;以及其他的碰撞
与其将向量的多个分量组合成一个标量值进行比较,不如直接比较每个分量,例如
int CompareTo(Point p)
{
if (this.X < p.X)
{
return -1;
}
else if (this.X > p.X)
{
return 1;
}
else
{
return this.Y.CompareTo(p.Y);
}
}