正确实现不同类型但语义等效的两个对象的比较

2024-02-13

我发现了类似的问题

如何比较具有相似属性的两个截然不同的对象 https://stackoverflow.com/questions/1725327/how-to-compare-two-distinctly-different-objects-with-similar-properties

这可能隐含地和/或部分地回答了我的问题。

假设我想比较(没有很多嵌套条件)这个对象:

class ObjectA {
  public string PropertyX { get; set; }
  public char PropertyY { get; set; }
  public long PropertyZ { get; set; }
}

to a System.String。我只感兴趣equality or 不等式(不是关于身份的一系列值)。

实施IEquatable<string> in ObjectA是一个正确的选择吗?我不在乎什么简单有效,我想确定这种情况的正确模式。

作为其他信息,请考虑ObjectA通常会作为以下序列提供IEnumerable<ObjectA>.

我不需要知道是否"string" == or != objectA实例;不涉及排序。

编辑以澄清(和帮助)

抱歉,写一个好问题有时很困难......

假设我不能代表ObjectA作为字符串以进行比较(不能选择违反封装)。

  • 在 context-1 中我必须将它与PropertyY.

  • 在 context-2 中,我必须将其与应用于的算法进行匹配PropertyY/PropertyZ.

@Oliver 问题末尾的解决方案再次帮助了我(并再次+1)。 我可以简单地定义一个自定义接口:

interface IContextConverter {
  string ToEquatableStringForContext1();
  string ToEquatableStringForContext2();  
}

因为我也有一个ObjectB具有相同的逻辑但不同的属性,两者都会实现IContextConverter (或者也许我会找到一个更好的名字)避免违反RAP http://codemanship.co.uk/parlezuml/blog/?postid=934.


我强烈推荐not实施IEquatable<string>,因为特别是在使用集合、字典、LINQ 等时,您并不真正知道何时会在内部深处调用其中一种方法,这可能会导致微妙的错误。

由于您喜欢比较两个不同类型的对象,因此可以简单地进行比较Comparer<T>也行不通。

所以要么写一个TypeConverter http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx它将您的对象转换为所需的类型(在您的情况下是string)或向您的对象添加一个方法,例如.ToEquatableString()并使用它们的输出将您的对象与其他字符串进行比较。

下面是一个示例,您可以获取与另一个集合中的字符串之一匹配的所有元素:

IEnumerable<String> otherElements = new[] {"abc", "def", "ghi" };
IEnumerable<ObjectA> myObjects = GetObjects();

var matchesFound = otherElements.Join( // Take the first collection.
              myObjects, // Take the second collection.
              s => s, // Use the elements in the first collection as key (the string).
              obj => obj.ToEquatableString(),  // Create a string from each object for comparison.
              (s, obj) => obj, // From the matching pairs take simply the objects found.
              StringComparer.OrdinalIgnoreCase); // Use a special string comparer if desired.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确实现不同类型但语义等效的两个对象的比较 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 在 Xcode4 中使用 Boost

    有人设置 C Xcode4 项目来使用 Boost 吗 对于一个简单的 C 控制台应用程序 我需要在 Xcode 中设置哪些设置 Thanks 用这个来管理它 和这个
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 无法使用 Ninject 将依赖项注入到从 Angular 服务调用的 ASP.NET Web API 控制器中

    我将 Ninject 与 ASP NET MVC 4 一起使用 我正在使用存储库 并希望进行构造函数注入以将存储库传递给其中一个控制器 这是实现 StatTracker 接口的上下文对象 EntityFramework public cla
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu

随机推荐

  • CMake、C++ 和 Jenkins/持续集成

    我有一个 CMake 示例项目 我想在 Ubuntu 15 10 上运行的 Jenkins 上构建该项目 我已经安装了 https wiki jenkins ci org display JENKINS CMake Plugin https
  • 如何在java中将Mongo DB中的数据导出为ex​​cel格式

    MongoDB 中的架构 姓名 卡马拉 流动 Date 2018 08 03 New set Form y 1 d 3 p 3 我的java代码 公共静态无效主 字符串 args String db Database String col
  • 处理 JSON 对象的最佳方法是什么?

    我有一个代表 JSON feed 的大字符串 我的应用程序从远程网络服务下载此提要 问题 1 下载 JSON feed 后 我应该将其存储在哪里 现在我将其存储在应用程序首选项中并且工作正常 我只是感兴趣是否有任何理由不这样做 或者是否有更
  • 编写 gem 时设置配置设置

    我正在编写一个 gem 我希望它可以在有或没有 Rails 环境的情况下工作 我有一个Configuration允许配置 gem 的类 module NameChecker class Configuration attr accessor
  • 在列表(或其他数据结构)中有效插入多个元素并保持其顺序

    我有一个项目列表 应该一个接一个地插入到类似列表的数据结构中 并且我有每个项目应该插入的索引 例如 items itemX itemY itemZ indexes 0 0 1 预期的结果是有一个像这样的列表 result itemY ite
  • C++ 模板类;任意容器类型的函数,如何定义它?

    好的 简单的模板问题 假设我定义我的模板类是这样的 template
  • 在 macOS 上的 MAMP 或 XAMPP 上安装 phalcon 时出现错误

    我正在尝试在 macOS 上的 xampp 或 MAMP 上安装 phalcon 请告诉我如何在 MAMP 上正确安装 phalcon 我在 XAMPP 上安装时遇到相同的错误 我用这个教程https madebyextreme com i
  • 通过连接到满足某些条件的另一个表的最新记录来更新表

    我试图避免为此解决方案使用循环的冲动 而是使用基于集合的操作 我需要根据最近出现的与另一个表的连接来更新表中的每条记录 我的第一个想法是加入到我需要 最近日期 的表并根据连接条件进行分组 但是使用GROUP BY with UPDATE是无
  • new() 没有 delete() 是未定义行为还是仅仅是内存泄漏? [复制]

    这个问题在这里已经有答案了 可能的重复 内存泄漏是 C 中的 未定义行为 类问题吗 https stackoverflow com questions 1978709 are memory leaks undefined behavior
  • 使用 terraform 部署 Azure 功能

    我有以下 terraform 代码 用于使用 zip 部署将函数应用程序和函数部署到 Azure 门户 terraform required providers azurerm source hashicorp azurerm versio
  • 查找适用于 Windows 的 javafx jar 文件

    有谁知道在哪里可以找到该jar文件javafxWindows 的包 我只能找到 zip 文件和 exe 文件 有人可以回答并提供下载包的链接吗 您需要首先安装 javafx sdk 2 0 1 windows i586 exe 这将在您的计
  • 无法将 Firebase 导入到 Swift 类中

    我对 Firebase 和构建 iOS 应用程序完全陌生 在 Xcode 7 中 我尝试将 Firebase 导入到我的 Swift 类中 在一个 swift 文件中 我输入了 import Firebase 我收到一条错误消息 没有这样的
  • MvvmCross 5.4 在 ConsoleLogProvider 中使用 NullRef 启动应用程序时崩溃

    我已更新我的 Xamarin Android 应用程序包MvvmCross from 5 3 2 to 5 4并且应用程序在启动时开始崩溃 我手动确定原因是链接器 我有link SDK libs only选项已启用 随着None选项它工作得
  • Spinner 的 RxBindings?

    我是新的 android 和 rxjava 我经历过很多使用 rxbindings 监听事件的例子 比如这个 RxView clicks b subscribe new Action1
  • Java,如何绘制不断变化的图形

    以前没有这样做过 所以显然我很糟糕 这里 当前鼠标位置周围的 64 像素在表单上绘制得稍大一些 问题是 它 有点 慢 而且我不知道从哪里开始修复 除此之外 我创建了一个线程 在完成后不断调用更新图形和一些类似文本的 fps 以真正显示绘制事
  • RabbitTemplate 接收并重新排队

    我想从队列接收消息并立即将它们出队 事实上我想模仿rabbitMQ管理控制台的行为 它可以接收消息并将其重新排队 所以我的问题是如何做到这一点 起初 我试图克隆消息并重新发送它们 但rabbitTemplate似乎无法将消息直接发送到队列
  • Heroku 登录错误:证书链中的自签名证书

    我正在尝试在 Mac 上使用 Heroku CLI 当我尝试使用 Heroku 登录名登录 Heroku 并提供我的凭据时 出现以下错误 错误 证书链中的自签名证书 我已多次尝试卸载并重新安装它 但仍然收到此错误 我该如何解决 由于我的组织
  • 传递任意大小的二维数组

    您好 我正在研究排序算法 为此我想制作一个简单的程序来从文本文件中获取整数数组 在这样做的同时 我遇到了一些关于将它们作为参数的数组和函数的麻烦和问题 这是我所做的 include
  • MySQL 中的复合主键性能缺陷

    我们有一个表 其复合主键由三个字段组成 在 MySQL 5 1 中 该表每秒有近 200 次插入和 200 次选择 表的大小约为 100 万行 并且还在不断增加 我的问题是 复合主键 是否会降低该表上的插入和选择的性能 我应该使用简单的自动
  • 正确实现不同类型但语义等效的两个对象的比较

    我发现了类似的问题 如何比较具有相似属性的两个截然不同的对象 https stackoverflow com questions 1725327 how to compare two distinctly different objects