比较两个对象的内容是否相等。

22

我有两个复杂对象(即具有字符串、整数、双精度浮点数、列表和其他自定义数据类型的对象),这两个对象属于同一类型。我想比较它们之间的内容,以确保它们完全相同。注意:该对象未实现.Equals方法(我无法控制),也没有实现IComparable接口。

是否有一种通用的方式(反射?)来比较这两个对象的内容?

谢谢!

13个回答

1

感谢Marc提供的MemoryStream方法。当我看到参数中有"this"时,我还以为出现了错误,但令人惊讶的是编译器实际上允许这样做,对吧?我稍微改了一下,选择重写Equals()方法。同时也值得称赞的是使用了长度和数组比较而不是SequenceEquals()。写起来会多花费一些时间,但根据http://www.dotnetperls.com/sequenceequal,性能更好。

public override bool Equals(object obj)
{
    // If comparison object is null or is a different type, no further comparisons are necessary...
    if (obj == null || GetType() != obj.GetType())
    {
        return false;
    }

    // Compare objects using byte arrays...
    using (MemoryStream memStream = new MemoryStream())
    {
        BinaryFormatter binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));

        // Get byte array of "this" object...
        binaryFormatter.Serialize(memStream, this);
        byte[] b1 = memStream.ToArray();

        // Get byte array of object to be compared...
        memStream.SetLength(0);
        binaryFormatter.Serialize(memStream, obj);
        byte[] b2 = memStream.ToArray();

        // Compare array sizes. If equal, no further comparisons are necessary...
        if (b1.Length != b2.Length)
            return false;

        // If sizes are equal, compare each byte while inequality is not found...
        for (int i = 0; i < b1.Length; i++)
        {
            if (b1[i] != b2[i])
                return false;
        }
    }

    return true;
}

0

你可以编写一些逻辑来比较两个对象的所有属性。当涉及到具有复杂子类型的对象图时,这会变得复杂,因此您需要确定什么程度的接近是足够好的。


0
你需要一个比较方法,可以使用C++编写全局函数,但我认为C#不允许这样做,就像Java一样。
我的建议是编写一个实现iComparable接口的类,并具有以所需类的对象为参数的构造函数和包括Equals函数。设置它只保留对原始对象的引用,以节省内存分配。然后你可以编写
Foo(A).Equals(new Foo(B))
你也可以从提供的类中继承,但这意味着需要创建和跟踪这些内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接