0

假设我有一个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); 以及介于两者之间的所有其他碰撞。

4

1 回答 1

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);
    }        
}
于 2013-05-13T06:44:36.193 回答