使用 IEqualityComparer 的建议最佳实践是什么?

2023-11-22

我正在寻找现实世界的最佳实践,其他人可能如何实施具有复杂领域的解决方案。


任何时候您考虑使用IEqualityComparer<T>,停下来思考是否可以让该类来实现IEquatable<T>反而。如果一个Product应始终按 ID 进行比较,只需将其定义为相等,以便您可以使用默认比较器。

也就是说,您可能需要自定义比较器的原因仍然有一些:

  1. 如果有多种方式可以将类的实例视为相等。最好的例子是字符串,框架为其提供了六个不同的比较器StringComparer.
  2. 如果该类的定义方式无法将其定义为IEquatable<T>。这将包括其他人定义的类和编译器生成的类(特别是匿名类型,默认情况下使用属性比较)。

如果您确实决定需要一个比较器,那么您当然可以使用通用比较器(请参阅DMenT的答案),但如果您需要重用该逻辑,则应该将其封装在一个专用类中。您甚至可以通过从通用基类继承来声明它:

class ProductByIdComparer : GenericEqualityComparer<ShopByProduct>
{
    public ProductByIdComparer()
        : base((x, y) => x.ProductId == y.ProductId, z => z.ProductId)
    { }
}

就使用而言,您应该尽可能利用比较器。例如,而不是调用ToLower()在用作字典键的每个字符串(其逻辑将散布在您的应用程序中)上,您应该声明字典以使用不区分大小写的StringComparer。对于接受比较器的 LINQ 运算符也是如此。但同样,始终要考虑可等同的行为是否应该是类固有的,而不是外部定义的。

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

使用 IEqualityComparer 的建议最佳实践是什么? 的相关文章

  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • 当我单击 C# 中的“取消”按钮时重定向到新页面(Web 部分)

    Cancel button tc new TableCell btnCancel new Button btnCancel Text Cancel btnCancel Click new EventHandler btnCanel Clic
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

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

随机推荐

  • 使用 matplotlib 绘制 sklearn LinearRegression 输出

    导入文件后 我使用 numpy 将 x values 和 y values 分开 import pandas as pd from sklearn import linear model from matplotlib import pyp
  • 将 pandas 数据帧拆分为 N 个块[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我目前正在尝试将 pandas 数据帧拆分为未知数量的包含每 N 行的块 我尝试过使用 numpy array split 这个函数 但是将数据帧分割成包含未知行数的 N 个块 有没有一种
  • Mono 兼容的依赖注入框架

    Which 依赖注入框架兼容 并经过测试 Mono2 4 2 3 运行时 发行说明 温莎城堡 is
  • Fragment 元素中的 Fragment onClick 方法

    我读了很多关于片段的文章 但我仍然对如何做什么感到困惑 我有一个 MainActivity 它并排显示两个片段 在其中一个片段中 我有一个按钮 并在该按钮的片段布局 XML 中定义 android onClick buttonClicked
  • 使用 wget 递归获取其中包含任意文件的目录

    我有一个 Web 目录 用于存储一些配置文件 我想使用 wget 来提取这些文件并维护它们当前的结构 例如 远程目录如下所示 http mysite com configs vim vim 包含多个文件和目录 我想使用 wget 在客户端上
  • 使用开发依赖项在 Heroku 上部署时尝试从命名空间“Symfony\Bundle\WebProfilerBundle”加载类“WebProfilerBundle”

    我们有一个托管在 Heroku 上的 Symfony 4 3 Web 应用程序 这是一个新的设置我们从未设法让开发模式正常工作 网上有很多类似的问题 但没有一个能解决我们在这里面临的确切症状 该项目是使用命令行创建的 composer cr
  • MySQL InnoDB 数据库恢复

    我必须恢复在 MySQL 5 0 中无意中删除的数据库 通过检查备份文件 我似乎只有 FRM 文件来保存数据库数据 任何人都可以建议这是否是我从备份执行数据库恢复 导入所需的全部内容 或者我还需要提供其他文件来完成此操作吗 frm 文件不是
  • 如何像 Eclipse 一样清理 IntelliJ IDEA 中的项目缓存?

    有时IDE会因为缓存而出现一些错误 在Eclipse中 我们可以使用clean来解决问题 我怎样才能在 IntelliJ 中做到这一点 取决于您正在运行的版本 基本上是一样的 只需转到 File gt 使缓存无效 然后重新启动Intelli
  • 什么是 .exe 文件存根?

    我正在学习如何使用混淆我的程序集 NET反应堆 一种选择是 生成本机 x86 EXE 文件存根 我不明白它的目的 我导入一个程序集 例如 exe 文件 并输出一个经过混淆的 exe 文件 其大小大致相同 如果我检查过 生成本机 x86 文件
  • 在 VS2010 Express 中创建构造函数的代码片段

    VS 2010 Express 版本 适用于 C 中是否有任何现成的代码片段 可以使用选定属性中的参数创建构造函数 当我创建一个新类并编写以下代码时 public class FileDetails public int ID get se
  • 将 C# 控制台应用程序转换为 DLL

    我正在将 Betfair API 从 SOAP 重写为 JSON 并且按照之前的方式开始 将其作为控制台应用程序 然后从任务调度程序或 win 服务中调用 然而现在我被要求用代码做各种不同的工作 我不想为每项工作编写一个控制台应用程序 不同
  • error_code:如何设置和检查errno

    我试图了解在调用设置的 C 函数时应该使用什么类别errno在 Linux 上 我不确定所有可能的错误代码都是由 POSIX 定义的 所以我很想使用system category 但我喜欢稍后在代码中处理通用条件 所以我想做这样的事情 st
  • Flutter 入门屏幕仅一次

    我是 flutter 和 dart 的新手 我正在尝试制作一个带有 3 页的入门屏幕的应用程序 并且当用户已经打开该应用程序一次时 我试图跳过入门屏幕 我见过与共享偏好类似的东西 但我无法使其发挥作用 这是我的入门屏幕 class Onbo
  • 在没有 Maven 或 Gradle 的情况下将 JUnit 5 与 Java 9 结合使用

    说明 我想使用创建一个 JUnit 测试JUnit 5 in 日食 氧气 4 7 1a 此 JUnit 测试应位于名为 Test 的单独 src 文件夹内 然而 由于我是 JUnit 的新手 我遇到了以下问题Java 9 I 不要使用像这样
  • PHP按键值降序对数组进行数字排序[重复]

    这个问题在这里已经有答案了 PHP 中是否有一个选项可以按键值降序对数组进行排序 我知道您可以使用以下命令对键值进行排序ksort 是的krsort fruits array d gt lemon a gt orange b gt bana
  • PySpark:获取数据框中每列的第一个非空值

    我正在处理不同的 SparkDataFrames 其中许多列中有很多 Null 值 我想要得到any one每个列中的非空值 以查看该值是否可以转换为日期时间 我尝试做df na drop first 希望它会删除所有具有空值的行以及剩余的
  • 使用像 bash 管道这样的操作系统进程:发送 STDIN 并获取其 STDOUT

    我正在尝试使用外部过程它读取 STDIN 并写入 STDOUT 我想在 Elixir 中编写与此等效的内容 而不使用外部库或包装脚本 echo foo nkf foo 即发送数据到nkf在 stdin 上 并从返回转换后的结果nkf的标准输
  • LUA 中的随机种子

    我正在编写一个随机化数字的代码 我放math randomseed os time 在一个循环内 代码如下 for i 1 1000 do math randomseed os time j math random i row one u
  • 是否可以为 Android 应用程序提供动画启动器图标? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我只是好奇 Android 是否支持动画启动器图标 例如 iOS 的日历应用程序始终显示当前日期或图标上有移动的手的时钟 不是一般情况下 安卓有应用程序小部件为了那个原因 某些主屏幕
  • 使用 IEqualityComparer 的建议最佳实践是什么?

    我正在寻找现实世界的最佳实践 其他人可能如何实施具有复杂领域的解决方案 任何时候您考虑使用IEqualityComparer