将一个类实例与另一个包含匹配值的实例进行比较

时间:2018-12-16 20:45:13

标签: c# class comparison

我得到一个类的一个实例不等于同一类的另一个实例,即使两个实例都包含属性,并且实例的字段包含相同的值。例如,在下面的代码中,即使TestClassTestValue01属性的两个TestValue02实例具有相同的值,比较也将等于false,而"Boooo!"将等于被打印。

static void Main(string[] args)
{
    TestClass testClassInstance01 = new TestClass(1, 1);
    TestClass testClassInstance02 = new TestClass(1, 1);

    if (testClassInstance01 == testClassInstance02)
    {
        Console.WriteLine("Woohoo!");
    }
    else
    {
        Console.WriteLine("Boooo!");
    }
}

class TestClass
{
    public int TestValue01 { get; private set; }
    public int TestValue02 { get; private set; }

    public TestClass(int testValue01, int testValue02)
    {
        TestValue01 = testValue01;
        TestValue02 = testValue02;
    }
}

是否有可能迫使这种比较等同于true?

显而易见,要做的是使属性值相同,如下所示,但是我很好奇是否可以避免。

if (testClassInstance01.TestValue01 == testClassInstance02.TestValue01
    && testClassInstance01.TestValue02 == testClassInstance02.TestValue02)
{
    Console.WriteLine("Woohoo!");
}
else
{
    Console.WriteLine("Boooo!");
}

编辑

出于完整性考虑,我一直在寻找operator overloading。这是我需要此示例返回true的代码:

class TestClass
{
    public int TestValue01 { get; private set; }
    public int TestValue02 { get; private set; }

    public TestClass(int testValue01, int testValue02)
    {
        TestValue01 = testValue01;
        TestValue02 = testValue02;
    }

    public static bool operator==(TestClass tc01, TestClass tc02)
    {
        return tc01.TestValue01 == tc02.TestValue01 && tc01.TestValue02 == tc02.TestValue02;
    }

    public static bool operator!=(TestClass tc01, TestClass tc02)
    {
        return tc01.TestValue01 != tc02.TestValue01 || tc01.TestValue02 != tc02.TestValue02;
    }
}

2 个答案:

答案 0 :(得分:1)

重载==运算符。我有一段时间没做C#了,我有点生疏了,但是您可以看看运算符重载来定义这种行为

答案 1 :(得分:1)

Marij Khans的回答基本上是正确的。在不重载运算符的情况下,ReferenceEquals(object,object)在应用于类实例时用于'=='和'!=',并且因为在您的示例中您比较两个实例,所以结果为'false'。完整的解决方案如下所示:

from graphviz import Digraph
import io

dot = Digraph(comment='The Round Table', format='gv')
dot.node('A', 'King Arthur')

data = io.StringIO()

print("writing")
data.write( dot.pipe().decode('utf-8') )

print("reading")
data.seek(0)
print(data.read())

# print(data.getvalue())


data.close()

除了运算符'=='和'!='的重载之外,IEquatable接口的实现还确保比较始终按预期工作,即使在用作字典或模式a.Equals(b)的键时也是如此用过的。为了在以此类的实例为键搜索大型集合时提高速度,您甚至可能想要实现GetHashCode(),但这要求生成哈希码时使用的值必须是只读的(即,删除属性的setter,因此只能在构造函数中进行设置。