在比较两个对象时有条件地更改GetHashCode()

时间:2015-06-08 08:04:55

标签: c# .net performance comparison gethashcode

我有两个不同的对象列表,并希望根据某些属性的权重获得它们的相似性。最快的方式似乎是实现IEquatable接口,这就是我所做的:

cv::Mat adaptada(colorImage.size(), CV_16UC3);

uint32_t * pixelPtr = (uint32_t *) colorImage.data;
uint16_t* pixelPtrDest = (uint16_t*) adaptada.data;

for(int i = 0; i < colorImage.rows; i++)
{

    for(int j = 0; j < colorImage.cols; j++)
    {

        uint32_t src_pixelval = pixelPtr[colorImage.channels()*(colorImage.cols*i + j)];

        uint16_t conv = cvRound(src_pixelval * 32);

        pixelPtrDest[adaptada.channels()*(adaptada.cols*i + j) + 0] = conv;
        pixelPtrDest[adaptada.channels()*(adaptada.cols*i + j) + 1] = conv;
        pixelPtrDest[adaptada.channels()*(adaptada.cols*i + j) + 2] = conv;

    }

}

System::IntPtr ptr(adaptada.ptr());
System::Drawing::Bitmap^ b  = gcnew System::Drawing::Bitmap(adaptada.cols,adaptada.rows,adaptada.step,System::Drawing::Imaging::PixelFormat::Format48bppRgb ,ptr);

问题在于,当我覆盖GetHashCode()方法时,我只会获得完全相同或在此特定情况下的那些 - 仅使用相同的电子邮件。

如何在GetHashCode()方法中有条件地检查权重,以便我可以使用正确的方法Equals? 或者有没有办法用其他方式进行相似性检查,性能是否良好?

1 个答案:

答案 0 :(得分:5)

Equals / GetHashCode并未设计用于比较大多数情况相同的事物#34;。在这种情况下,Equality只是一个布尔属性。特别是,模糊&#34;大多数相等&#34;方法导致传递性问题。 Object.Equals的文件包含了这一要求:

  

如果(x.Equals(y) && y.Equals(z))返回true,则x.Equals(z)会返回true

当你有模糊的平等时,这根本就不成立。仅仅因为x是&#34;非常喜欢&#34; yy是&#34;非常喜欢&#34; z并不代表x是&#34;非常喜欢&#34; z

现在你可以做的是有一个相等比较器,它只比较电话号码,另一个只比较名字的相等比较器等等 - 但这并不能真正让你模糊匹配。 / p>