我有一个符号实体,当与另一个实体相比时有这种行为:
我想知道如何在这种情况下实现此Equality,特别是GetHashCode()。
答案 0 :(得分:1)
我会说(基于我对你的例子的理解),这样的事情。你可以包含一个更复杂的哈希代码,它与你的FileDate和CRC32相似,但实际上,因为常见的粘合剂始终是FileName,你可以将它用作代理哈希码。
请记住,Equal()对象永远不应该有不同的哈希码,但是!Equal()对象可能具有相同的哈希码(它只是潜在的冲突)。
此外,您还要注意作为哈希代码一部分的字段是可变的,否则对象的哈希码可以“更改”,这在字典中可能非常糟糕......
public sealed class Symbol : IEquatable<Symbol>
{
public string FileName { get; set; }
public DateTime FileDate { get; set; }
public long CRC32 { get; set; }
public bool Equals(Symbol other)
{
if (other == null)
{
return false;
}
return FileName == other.FileName &&
(FileDate == other.FileDate || CRC32 == other.CRC32);
}
public override bool Equals(object obj)
{
return Equals(obj as Symbol);
}
public override int GetHashCode()
{
// since FileName must be equal (others may or may not)
// can use its hash code as your surrogate hash code.
return FileName.GetHashCode();
}
}
答案 1 :(得分:0)
public override bool Equals(object obj)
{
var file = obj as Symbol;
if ( file.FileName == FileName && file.FileDate == FileDate )
return true
else
return Boolean Value of [Compare CRC Here];
}
以下是如何计算文件的CRC。
http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net
这基本上就是詹姆斯迈克尔黑尔所说的我只是慢了。