0

我需要知道使用哈希码比较许多对象的方法。所以这是其中的一课。

public class Test: IEquatable<Test>
{
    public Test()
    {
    }

    public string ID { get; set; }
    public string Name{ get; set; }

    public static int SafeGetHashCode<T>(this T value) where T : class
    {
        return value == null ? 0 : value.GetHashCode();
    }

    public override int GetHashCode()
    {
        int hash = 19;
        hash = hash * 31 + ID.SafeGetHashCode();
        hash = hash * 31 + Name.SafeGetHashCode();
        return hash;
    }

    public override bool isSame(object obj)
    {
         // compare objects here
    }
}

但是有2个错误。两者都是一样的。

“string”不包含“SafeGetHashCode”的定义,并且找不到接受“string”类型的第一个参数的扩展方法“SafeGetHashCode”(您是否缺少 using 指令或程序集引用?)

而对于isSame(),我不知道怎么写代码。概念是比较所有对象,如果有 2 个相同的 ID 和名称,将它们组合在一起。

Item A = new Item();
Item B = new Item();
Item c = new Item();

A.ID = "Exam1";
A.Name = "Apple";

B.ID = "Exam1";
B.Name = "Orange";

C.ID = "Exam1";
C.Name = "Apple";

所以项目 A 和 C 将组合在一起。

4

2 回答 2

2

扩展方法必须是静态类的成员,它应该处理第一个错误。SafeGetHashCode移出您的班级,以便您可以将Test其用作扩展String和其他引用类型:

public static class TestHashCodeExtension
{
    public static int SafeGetHashCode<T>(this T value) where T : class
    {
        return value == null ? 0 : value.GetHashCode();
    }
}

至于实现IEquatable<T>.Equals(我假设您isSame的方法名称不正确,也奇怪地标有override-isSame在任何 .Net 类中都没有,尤其是在 .Net 类中没有Object):

  • 确保也实现Equals基础IEquatable<T>.Equals
  • 请参阅IEquatable.Equals中的示例以实现两个Equals调用

缩短样本:

public bool Equals(Test other) 
{
  return (other == null) ?
     false : (Id == other.Id) && (Name == other.Name);
}

public override bool Equals(Object obj)
{
  Test testObj = obj as Test;
  return testObj == null ? false : Equals(testObj);   
}

注意:一般Equals不需要先使用GetHashCodeDictionary(主要原因GetHashCode存在)总是在调用之前检查哈希码本身Equals。在大多数情况下,两者GetHashCodeEquals都作为每个成员的哈希/比较来实现。因此,除非您确定您的类缓存结果,GetHashCode因为没有实际理由检查哈希码,Equals因为您最终会触摸两次(Equals如果第一个字段不相等,则可以短路比较,不像GetHashCode需要使用所有/大多数字段来计算结果)。

于 2013-04-15T03:40:51.283 回答
2

就我个人而言,我只是内联它 - 不需要额外的方法:

public override int GetHashCode()
{
    int hash = 19;
    hash = hash * 31 + (ID == null ? 0 : ID.GetHashCode());
    hash = hash * 31 + (Name == null ? 0 : Name.GetHashCode());
    return hash;
}

添加不受约束的扩展方法会污染诸如智能感知之类的东西。

于 2013-04-15T06:55:05.113 回答