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

2023-11-23

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

Ex:

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;
}

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

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

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


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

通常,您不会为此使用反射,您只需自己比较每个字段即可。这IEquatable<T>为此目的而存在接口,您可能还想覆盖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就像他们对待其他事情一样。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较 2 个自定义对象 - C# 的相关文章

  • 为什么单击 ToolStrip 按钮两次时会引发 NullReferenceException - openFileDialog.showDialog()?

    我创建了一个干净的 Windows 窗体应用程序解决方案 添加了ToolStrip到主窗体 并在其上放置一个按钮 我还添加了一个OpenFileDialog 所以这样Click event of the ToolStripButton看起来
  • 为什么Java不支持C中的clrscr这样的函数?

    我有一个问题 对很多人来说可能听起来很愚蠢 但我不能停下来把它发布在这里 因为在互联网上找不到任何东西 为什么java没有我们在C中使用的clrscr之类的函数 如果我创建了一个基于用户输入反复迭代的 java 控制台应用程序 然后如果我想
  • 在 C# 中将 Exe 文件作为嵌入式资源运行

    我有一个第 3 方 EXE 我只需要从我的 C 应用程序运行它 我的主要目标是对我的 C 文件中的第 3 方可执行文件进行版权保护 有没有更好的方法来做到这一点 我怎样才能做到这一点 首先将嵌入的可执行文件作为资源文件添加到您现有的资源文件
  • 在硬件不足的情况下进行编码

    我目前正在使用 C 中的 SIMD 指令进行编码 并尝试使用 IDE 在实时编码时显示错误 拼写错误等 问题是 我使用的是 AVX512 指令 我的硬件不支持这些指令 只有我用于编译的服务器支持 有没有一种方法可以在 IDE 中进行错误检查
  • 通过模板参数向类添加方法

    我希望在类中拥有一个模板参数特定函数 取消启用enable if 它的名称保持不变 参数类型有所不同 尽管这应该不相关 因为只有一个被初始化 enum class MyCases CASE1 CASE2 template
  • 如何将外部文件添加到应用程序文件(clickonce / .NET)

    我在用着 发布 vs2008 中的选项 我很高兴它的工作原理 现在我想添加 2 个外部 exe 文件到已安装的包中我注意到按钮 应用程序文件 在发布选项卡上 但似乎不允许手动添加新文件 我已经玩过这个并找到了存档的方法 1 将EXE文件作为
  • C# Response.Write pdf 不适用于 Android 浏览器

    我目前在 Android 环境中使用 pdf 导出时遇到了巨大的问题 我正在使用报告查看器控件将报告呈现为字节数组 接下来我使用response binarywrite方法将字节流输出到浏览器 这适用于所有浏览器以及 iPhone 和 iP
  • ElementReference 对 Blazor 中条件创建的元素的引用

    我正在尝试将焦点设置为有条件呈现的输入控件 我正在设置ElementReference但它的 id 和 context 都是空的
  • std::function 中参数的自动动态转换

    我们有多态类 A 和 B 例如 struct A virtual A struct B final public A void f std cout lt lt f lt lt std endl 我想分配一个变量std function
  • CLR 程序集不会在 64 位 SQL Server 2005 中加载

    我们在安装 SQL Server 2005 32 位 时使用带有一些用户定义函数的程序集 我们使用如下脚本将其部署到生产环境 CREATE ASSEMBLY Ourfunctions AUTHORIZATION dbo FROM 0x4D5
  • 在异步方法中显示错误消息的更好方法

    事实上我们不能使用await关键字在catch块使得在 WinRT 中显示来自异步方法的错误消息变得非常尴尬 因为MessageDialogAPI 是异步的 理想情况下我希望能够这样写 private async Task DoSometh
  • 为什么%c前面需要加空格? [复制]

    这个问题在这里已经有答案了 下面的代码一编译就给出了奇怪的o p main char name 3 float price 3 int pages 3 i printf nEnter names prices and no of pages
  • UWP 关闭信息亭模式

    我有一个发布到 Windows 应用商店的 UWP 应用程序 并且该应用程序可以启动进入信息亭模式 分配访问权限 它工作得很好 但我尝试在应用程序上创建一个按钮来关闭信息亭模式并返回到 Windows 登录屏幕 我尝试了文档中给出的代码 h
  • 非静态类中的静态方法有什么意义?

    我无法理解以下代码的潜在错误 class myClass public void print string mess Console WriteLine mess class myOtherClass public static void
  • Oracle DataAccess 相关:“动态程序集中不支持调用的成员。”

    据我了解 此类错误已在 SO 上讨论过多次 有些人认为这是 DLL 文件中的错误 有些人通过更改 DLL 版本来解决 其他人似乎没有任何线索 无论如何 我只是发帖试试运气 在 C GUI 上的网格中选择一行时 我的应用程序崩溃了 stack
  • 如何在 C# 中按进程获取打开文件句柄的列表?

    如何在 C 中通过进程 ID 获取打开文件句柄的列表 我也有兴趣挖掘并获取文件名 寻找与流程资源管理器所做的等效的编程 这很可能需要互操作 考虑到对此添加赏金 实现起来非常复杂 哎呀 这很难从托管代码中做到 有一个 大多数事情都可以在互操作
  • ASP.NET:通过命名空间一次注册多个控件?

    是否可以在 aspx 文件中注册用户控件的完整命名空间 而不是单独注册每个控件 我创建了一堆用户控件并将它们收集到自己的命名空间 MyWebControls 中 如下所示 隐藏代码 namespace MyWebControls publi
  • 单击 GridView 查找选定行

    我正在尝试获取 GridView 并从单击的行中获取数据 我已经尝试了下面的代码 当我单击该行时 我会返回选定的索引 但是当我查看 GridView 中的实际行时 它们显示为空 不知道我错过了什么 ASP 使我的网格
  • C#无循环方式将字符串拆分为多维数组或锯齿状数组

    如何在不循环的情况下将字符串拆分为多维数组或锯齿状数组 我看到一个代码片段 其中有人使用文件流执行此操作 但我不知道如何使其适用于我的字符串 我的字符串类似于1 2 3 1 4 1并可以分为ID Qty 这是我看到的代码 string li
  • ASP.NET 中的 ThreadStaticAttribute

    我有一个需要存储的组件static每个线程的值 它是一个通用组件 可以在许多场景中使用 而不仅仅是在 ASP NET 中 我想用 ThreadStatic 属性来实现我的目标 假设它在 ASP NET 场景中也能正常工作 因为我假设每个请求

随机推荐