我刚从6。0转到.net ,在c++2005中使用Hashtable,大概原型是这样
ref class PointPair: public IComparable 
{
public:
 int First;
 int Second;
.....
 virtual bool Equals(PointPair^ p)
{
 if((First ==p->First && Second ==p->Second) || (First ==p->Second && Second ==p->First))
{
return true;
}
else
{
return false;
}}
使用hashtable时添加键值为下面的格式
  ht->add(gcnew PointPair(p1,p2),value);
可查找时按如下格式却找不到
  ht->ContainKey(gcnew PointPair(p1,p2));
查找相同键值始终返回false请问这是不是引用出的问题,怎么解决
请问在C#中这种问题怎么解决的

解决方案 »

  1.   

    用.Net写vs托管.....
    等于自杀
      

  2.   

    try重写 PointPair
    的GetHashCode
      

  3.   

    重写 PointPair的GetHashCode?? 还要自己写Hash算法吗C#中应该也会遇到这种问题的,只是gcnew 改成了new,思想都一样,我怀疑是hashtable 中hash算法是跟据对象地址也就是对象引用值确定的,问题是怎么解决呢?
      

  4.   

    每个元素是一个存储在 DictionaryEntry 对象中的键/值对。键不能为空引用(Visual Basic 中为 Nothing),但值可以。用作 Hashtable 中的键的对象必须实现或继承 Object.GetHashCode 和 Object.Equals 方法。如果键相等性只是引用相等性,这些方法的继承实现将满足需要。此外,如果该键存在于 Hashtable 中,那么当使用相同参数调用这些方法时,这些方法必须生成相同的结果。只要键对象用作 Hashtable 中的键,它们就必须是永远不变的。
      

  5.   

    如果键相等性只是引用相等性,这些方法的继承实现将满足需要。楼上的我没看太明白,好象也是从msdn上摘下来的,看看我的代码,我也实现了Equals,可是还是不行,难道GetHashCode也要重新写吗?这怎么写呢?
      

  6.   

    作为键对象要求实现Equals和GetHashCodeht->add(gcnew PointPair(p1,p2),value);
    如果
    这样
    PointPair^ p1 = gcnew PointPair( ..... )
    ht->add(p1);
    ht->ContainKey(p1); //这里不用你实现GetHashCode 因为引用的同一性

    ht->ContainKey(gcnew PointPair()) //这里必须要求你实现GetHashCode,因为不是同一个对象,或者你使用 结构 不要用Class, 因为结构是值类型
      

  7.   

    我按照您的方法在类PointPair中实现了GetHashCode
     virtual int GetHashCode() override
       {
      return First ^ Second;
       }可是仍然找不到,难道是算法有问题吗?
      

  8.   

    Equals 重写的不对
    Equals( object^ o ) 非 Equals(PointPaire^ )
      

  9.   

    这个问题解决了,原来是重载函数不是原形的问题,谢谢hdt(倦怠)