如何比较两个Hashtables

时间:2011-12-21 14:08:53

标签: c# hashtable

我正在使用C#(使用XNA)开发一个小型RTS。

我将每个单位“转到”位置设置为他们应该去的向量。如果我不比较两个Hashtables,一切正常,但是当我这样做时,我得到这个“NullReferenceException未处理”的恼人错误。

以下是我收到错误的代码:

if (
    ((float)unit[(int)selectedunits[I+"ID"] + "posX"] != 
     (float)cgoto[(int)selectedunits[I+"ID"] + "X"])
    &&
    ((float)unit[(int)selectedunits[I+"ID"] + "posY"] !=
     (float)cgoto[(int)selectedunits[I+"ID"] + "Y"])
   )

希望这足够具体。

2 个答案:

答案 0 :(得分:0)

可悲的是,这里没有足够的信息。您在代码行中使用的某个引用类型在执行时为null。您可以做的是在该行上设置断点,并在调试模式下执行。当执行流程到达该行时,您可以检查您正在使用的所有引用,以查看哪一个为null,然后从那里诊断它为空的原因。

  1. http://msdn.microsoft.com/en-us/library/system.nullreferenceexception.aspx
  2. http://msdn.microsoft.com/en-us/library/490f96s2.aspx
  3. http://msdn.microsoft.com/en-us/library/9kkx3h3c.aspx

答案 1 :(得分:0)

您提供的散列表值比较没有问题。铸造和一些一般设计点存在一些问题。我相信在尝试将null转换为float / int时会遇到此类异常,以避免此类问题使用Hashtable.ContainsKey()方法检查给定密钥是否存在于哈希表中,然后才能访问它值。不要忘记在强制转换之前检查null值。此外,您可以考虑使用泛型类型IDictionary<string, float>see MSDN),因此所有值都将被输入,您不需要显式转换,这也会带来一些性能提升,因为不再需要像您的示例float -> object在存储值时使用object -> float(取消装箱)在检索和转换时。