比较 2 个对象的通用代码

发布于 2024-10-28 22:18:45 字数 83 浏览 0 评论 0原文

我有两个不同的对象需要比较相等性

我可以使用反射编写一些代码来比较属性值,但想知道 .net 4.0 中是否有任何新模式可以解决这个问题

i've two objects of different that need to be compared for equality

I can write some code using reflection to compare the property values but wondering if there're any new patterns in .net 4.0 that address this

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

书间行客 2024-11-04 22:18:45

我可以使用反射编写一些代码来比较属性值,但想知道 .net 4.0 中是否有任何新模式可以解决这个问题

问题。您必须编写自己的代码。

I can write some code using reflection to compare the property values but wondering if there're any new patterns in .net 4.0 that address this

No. You'll have to write your own.

薄暮涼年 2024-11-04 22:18:45

您可以在公共接口中实现公共比较属性,并将它们作为该接口类型进行比较。

You can implement the common comparison properties in a common interface and simply compare them as that interface type.

独闯女儿国 2024-11-04 22:18:45

您需要您的类实现 IComparable,然后重写并实现 CompareTo 方法,以帮助 C# 了解应如何比较这些对象。

作为一个例子,我想比较两个小部件。它是一个复杂的类,包含整数和字符串。我相信整数和字符串长度的组合将确定哪个对象更大。

Class MyWidget : IComparable
{
    public int Piece { get; set; }
    public string Thing { get; set; }
    public MyWidget()
    {
        this.Piece = 1;
        this.Thing = "default";
    }

    public int CompareTo(object obj)
    {
        var otherWidget = obj as MyWidget;
        if (otherWidget != null)
        {
            return (this.Piece + this.Thing.Length).CompareTo(otherWidget.Piece + otherWidget.Thing.Length);
        }
        else
        {
            throw new ArgumentException("Object is not a MyWidget");
        }
    }
}

You need your class to implement IComparable and then override and implement the CompareTo method to help C# understand how it should compare those objects.

As an example, I want to compare two widgets. It is a complex class that contains both an integer and a string. I believe that the combination of the integer and the length of the string will determine which object is larger.

Class MyWidget : IComparable
{
    public int Piece { get; set; }
    public string Thing { get; set; }
    public MyWidget()
    {
        this.Piece = 1;
        this.Thing = "default";
    }

    public int CompareTo(object obj)
    {
        var otherWidget = obj as MyWidget;
        if (otherWidget != null)
        {
            return (this.Piece + this.Thing.Length).CompareTo(otherWidget.Piece + otherWidget.Thing.Length);
        }
        else
        {
            throw new ArgumentException("Object is not a MyWidget");
        }
    }
}
薆情海 2024-11-04 22:18:45

如果您正在比较对象,您可能需要像这样重新定义 Equals() 函数:

        public override bool Equals(Object obj)
    {
        User testedUser = (User)obj;

        if (this._userName == testedUser.UserName &&
            this._userPassword == testedUser.UserPassword)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

然后您可以简单地执行以下操作: userbob.Equals(userAnne)

If you are comparing objects you might want to redefine the Equals() function like this :

        public override bool Equals(Object obj)
    {
        User testedUser = (User)obj;

        if (this._userName == testedUser.UserName &&
            this._userPassword == testedUser.UserPassword)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

Then you can simply do a : userbob.Equals(userAnne)

苹果你个爱泡泡 2024-11-04 22:18:45

对于比较大型对象图的快速而肮脏的方法,请将每一边转储到 json,然后使用文本差异

For a quick-and-dirty method of comparing large obejct graphs, dump each side to json and then use a text diff.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文