我有一些代码可以让我与实体框架实体进行比较。
但是,我注意到它有时会返回false(不匹配),而实际上它是真的(从逻辑角度来看)。
由于HashSets而失败 - 它们在比较时总是返回false。 HashSets通常是指向我不需要比较的其他实体的导航链接。
我可以对此代码进行任何修改以使其正常工作吗?
namespace Common.Helper
{
public sealed class PocoHelper<TPOCO> : IEqualityComparer<TPOCO> where TPOCO : class
{
public bool Equals(TPOCO poco1, TPOCO poco2)
{
var t = typeof(TPOCO);
if (poco1.IsNotNull() && poco2.IsNotNull())
{
bool areSame = true;
foreach(var property in typeof(TPOCO).GetPublicProperties())
{
object v1 = property.GetValue(poco1, null);
object v2 = property.GetValue(poco2, null);
if (!object.Equals(v1, v2))
{
areSame = false;
break;
}
};
return areSame;
}
return poco1 == poco2;
}
public int GetHashCode(TPOCO poco)
{
int hash = 0;
foreach(var property in typeof(TPOCO).GetPublicProperties())
{
object val = property.GetValue(poco, null);
hash += (val == null ? 0 : val.GetHashCode());
};
return hash;
}
}
}
答案 0 :(得分:-1)
当您比较的任何或两个对象都为空时,您应该返回false。
if (poco1.IsNotNull() && poco2.IsNotNull())
{
bool areSame = true;
foreach(var property in typeof(TPOCO).GetPublicProperties())
{
object v1 = property.GetValue(poco1, null);
object v2 = property.GetValue(poco2, null);
if (!object.Equals(v1, v2))
{
areSame = false;
break;
}
};
return areSame;
} else {
return false;
}
因为在msdn上给出你的“==”会返回true
// Returns true.
Console.WriteLine("null == null is {0}", null == null);
您可以在http://msdn.microsoft.com/en-gb/library/edakx9da.aspx
查看关于hashsets: HashSet的对象类型不必实现IEqualityComparer,而只需重写Object.GetHashCode()和Object.Equals(Object obj)。您可以在How does HashSet compare elements for equality?
看到完整的帖子