假设我有List<Point>
存储X和Y点的列表,但我希望这些点有序。假设我事先并不知道X和Y值的域,所以我将long
使用足够大的IComparable<>
。
在任何给定时刻,列表可能具有非常大或非常少量的点,并且这些点可能非常稀疏地分布,但是我需要能够非常有效地检索和插入特定点(如果它们存在于列表。
过去,我使用List.BinarySearch()
和10 * X + Y
取得了巨大成功。不幸的是,我需要能够根据和 X和Y值插入和检索。
如果我事先知道X和Y的域,并且域足够小,那么我可以将这些数字与一个数字一起添加到另一个域的下一个幂。这确保没有冲突,我可以有效地检索/插入值。例如,如果X和Y都在0到9之间,那么我可以在{{1}}上进行比较。因为我的所有数据类型都是64位整数,所以我无法真正做到这一点。
在不限制域名的情况下,还有其他方法可以实现此功能吗?
一种绝对有效的方法是在X.ToString(“N19”)+ Y.ToString(“N19”)上进行比较,但现在这是字符串比较而不是数字比较,这将带来巨大的性能罚。
编辑:我需要“N19”,否则(X = 1234,Y = 5)会解析为(X = 1,Y = 2345);以及其间的所有其他碰撞。
答案 0 :(得分:1)
不是将矢量的多个分量组合成一个标量值进行比较,而是可以比较每个分量,例如
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);
}
}