我有两个不同的对象列表,并希望根据某些属性的权重获得它们的相似性。最快的方式似乎是实现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? 或者有没有办法用其他方式进行相似性检查,性能是否良好?
答案 0 :(得分:5)
Equals
/ GetHashCode
并未设计用于比较大多数情况相同的事物#34;。在这种情况下,Equality只是一个布尔属性。特别是,模糊&#34;大多数相等&#34;方法导致传递性问题。 Object.Equals
的文件包含了这一要求:
如果
(x.Equals(y) && y.Equals(z))
返回true
,则x.Equals(z)
会返回true
。
当你有模糊的平等时,这根本就不成立。仅仅因为x
是&#34;非常喜欢&#34; y
和y
是&#34;非常喜欢&#34; z
并不代表x
是&#34;非常喜欢&#34; z
。
现在你可以做的是有一个相等比较器,它只比较电话号码,另一个只比较名字的相等比较器等等 - 但这并不能真正让你模糊匹配。 / p>