gpt4 book ai didi

c# - 比较 2 个自定义对象 - C#

转载 作者:太空狗 更新时间:2023-10-29 20:49:55 25 4
gpt4 key购买 nike

我需要在基类中编写一个通用方法,该方法将接受 2 个对象作为参数并比较它们是否相等。

例如:

public abstract class BaseData
{

public bool AreEqual(object O1, object O2)
{
//Need to implement this
}
}

public class DataTypeOne : BaseData
{
public string Name;
public string Address;
}

public class DataTypeTwo : BaseData
{
public int CustId;
public string CustName;
}

AreEqual() 方法将接受 2 个 DataTypeOne 实例或 2 个 DataTypeTwo 实例。

我的猜测是我需要使用反射吗?如果 LINQ 更具可读性/简洁性,我可以使用它。

编辑:我想在基类中实现这个方法的原因是因为项目限制。有大量开发人员致力于派生类。通过在基类中实现它,我试图让他们少操心一件事。

最佳答案

(假设你想要的是比较两个对象的所有字段是否相等。)

通常,您不会为此费心使用反射,您只需自己比较每个字段即可。 IEquatable<T>接口(interface)就是为此目的而存在的,您可能还想覆盖 Object.Equals()关于有问题的类型。例如:

public class DataTypeTwo : BaseData, IEquatable<DataTypeTwo>
{
public int CustId;
public string CustName;

public override int GetHashCode()
{
return CustId ^ CustName.GetHashCode(); // or whatever
}

public override bool Equals(object other)
{
return this.Equals(other as DataTypeTwo);
}

public bool Equals(DataTypeTwo other)
{
return (other != null &&
other.CustId == this.CustId &&
other.CustName == this.CustName);
}
}

此外,请考虑您的类型作为 struct 是否有意义反而。值类型通过逐字段比较自动比较相等性。

请注意,通过覆盖 Equals ,你基本上实现了(在我看来)你试图用你的“主等于方法”方案实现的目标。也就是说,人们使用 DataTypeTwo将能够自然地测试是否相等,而无需了解您的 API 的任何特殊之处——他们将只使用 Equals就像他们对待其他事物一样。

编辑:感谢 Jared 提醒我 GetHashCode .您还需要通过确保“相等”的任何两个对象也返回相同的哈希代码来覆盖它以在哈希表中保持正常的行为。

关于c# - 比较 2 个自定义对象 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com