c#如何找到两个对象是否相等

我需要知道最好的方式来比较两个对象,并找出是否相等。我覆盖GethashCode和Equals。所以一个基本类看起来像:

public class Test
{
    public int Value { get; set; }
    public string String1 { get; set; }
    public string String2 { get; set; }

    public override int GetHashCode()
    {
        return Value ^ String1.GetHashCode() ^ String2.GetHashCode();
    }

    public override bool Equals( object obj )
    {
        return GetHashCode() == obj.GetHashCode();
    }
}

所以为了测试目的,我创建了两个对象:

Test t = new Test()
{
    Value = 1,
    String1 ="One",
    String2 = "One"
};

Test t2 = new Test()
{
    Value = 1,
    String1 = "Two",
    String2 = "Two"
};

bool areEqual = t.Equals( t2 );

在测试这个areEqual返回true事件,虽然两个对象是不同的。我意识到这是因为String1和String2是相同的值在每个对象,因此在哈希时相互抵消。

有没有更好的方式关闭哈希对象,我有方法,将解决我的问题?

您当前的等式方法是破碎的 – 有比可能的哈希码更多的值。这是完全合理的(和预期),你会偶尔有不相等但给出相同的哈希值。等于应检查实际值:

public override bool Equals(object obj)
{
    Test test = obj as Test;
    if (obj == null)
    {
        return false;
    }
    return Value == test.Value &&
        String1 == test.String1 &&
        String2 == test.String2;
}

有几点要注意:

>如果String1和String2相同,则生成哈希码的方式将为任何固定值提供相同的值;它也会炸毁,如果String1或String2为null。这是使用XOR进行散列的一个不幸的方面。我喜欢这样:

// Put this extension method in a utility class somewhere
public static int SafeGetHashCode<T>(this T value) where T : class
{
    return value == null ? 0 : value.GetHashCode();
}

// and this in your actual class
public override int GetHashCode()
{
    int hash = 19;
    hash = hash * 31 + Value;
    hash = hash * 31 + String1.SafeGetHashCode();
    hash = hash * 31 + String2.SafeGetHashCode();
    return hash;
}

>一般来说,当涉及继承时,平等变得棘手。你可以考虑密封你的班级。
>您还可能希望实现IEquatable< Test>

翻译自:https://stackoverflow.com/questions/2920399/c-sharp-how-to-find-if-two-objects-are-equal

转载注明原文:c#如何找到两个对象是否相等