草庐IT

c# - 更喜欢 EqualityComparer<T> 而不是 IEqualityComparer<T>

coder 2023-07-09 原文

摘自MSDN上 IEqualityComparer<T> 备注部分:

  1. We recommend that you derive from the EqualityComparer<T> class instead of implementing the IEqualityComparer<T> interface, because the EqualityComparer<T> class tests for equality using the IEquatable<T>.Equals method instead of the Object.Equals method. ...

    • 我不理解引用中关于我们为什么更愿意从 EqualityComparer<T> 类派生而不是实现 IEqualityComparer<T> 的论点。这意味着实现 IEqualityComparer<T> 的对象将使用 Object.Equals 测试相等性,但是当我们不想使用 IEqualityComparer<T>Object.Equals 测试相等性时,实现 IEquatable<T>.Equals 不是全部意义所在吗?

    • 这也意味着如果我们从 EqualityComparer<T> 派生,那么派生类将使用 IEquatable<T>.Equals 方法测试是否相等。同样,当我们不想使用 EqualityComparer<T>Object.Equals 测试相等性时(因为 IEquatable<T>.Equals 已经使用 EqualityComparer<T>.DefaultObject.Equals 进行测试),从 IEquatable<T>.Equals 派生的全部意义不是吗?

  2. ... This is consistent with the Contains, IndexOf, LastIndexOf, and Remove methods of the Dictionary<TKey, TValue> class and other generic collections.

    • 我假设 .NET 库中的大多数集合通过调用 IEqualityComparer<T>IEquatable<T>.Equals 测试元素的默认相等性(即当用户不向这些集合提供他们自己的自定义 Object.Equals 对象时) (取决于类型 T 的元素是否实现 IEquatable<T> )通过 EqualityComparer<T>.Default

    • 为什么这些集合(在测试默认相等性时)不直接调用 IEquatable<T>.EqualsObject.Equals 而不是通过 EqualityComparer<T>.Default 类?

最佳答案

关于您的第一个问题:

备注部分为 IEqualityComparer<T> class 似乎并没有真正提供为什么您应该更喜欢从抽象类派生而不是接口(interface)的原因,这听起来更像是平等比较器接口(interface)首先存在的原因。它所说的实际上是无用的,它基本上描述了默认实现正在做什么。如果有的话,他们在这里提供的“推理”听起来更像是你的比较者可以做什么的指南,而与它实际做什么无关。

查看 EqualityComparer<T> 的公共(public)/ protected 接口(interface)类,只有一个可取之处,它实现了非泛型 IEqualityComparer界面。我认为他们的意思是说他们建议从中派生,因为 EqualityComparer<T>实际上实现了非泛型 IEqualityComparer接口(interface),这样你的类就可以在需要非通用比较器的地方使用。

IComparer<T> 的备注部分确实更有意义:

We recommend that you derive from the Comparer<T> class instead of implementing the IComparer<T> interface, because the Comparer<T> class provides an explicit interface implementation of the IComparer.Compare method and the Default property that gets the default comparer for the object.

我怀疑它应该为 IEqualityComparer<T> 说类似的话但有些想法被混淆了,最终导致描述不完整。


关于你的第二个问题:

图书馆馆藏的主要目标是尽可能灵活。一种方法是允许通过提供 IComparer<T> 来比较对象中的自定义方法。或 IEqualityComparer<T>做比较。在没有提供默认比较器的情况下获取默认比较器的实例比直接进行比较要容易得多。这些比较器反过来可以包含调用适当打包的适当比较所需的逻辑。

例如,默认比较器可以确定是否T工具 IEquatable<T>并调用IEquatable<T>.Equals在物体上或以其他方式使用 Object.Equals .最好封装在比较器中,而不是可能在集合代码中重复。

此外,如果他们想退回到调用 IEquatable<T>.Equals直接地,他们必须在 T 上添加约束这将使这个电话成为可能。这样做会降低灵 active ,并抵消了首先提供比较器的好处。

关于c# - 更喜欢 EqualityComparer<T> 而不是 IEqualityComparer<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5707347/

有关c# - 更喜欢 EqualityComparer<T> 而不是 IEqualityComparer<T>的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  4. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. ruby-on-rails - 没有参数的 `<<`(小于两倍)是什么意思? - 2

    我在一个我想在formtasticGem中覆盖的方法中找到了这个。该方法如下所示:defto_htmlinput_wrappingdohidden_field_html是什么意思?在第三行做什么?我知道它对数组有什么作用,但在这里我不知道。 最佳答案 你可以这样读:hidden_field_htmllabel_with_nested_checkbox是连接到hidden_​​field_html末尾的参数-为了“清晰”,他们将其分成两行 关于ruby-on-rails-没有参数的`

  10. ruby-on-rails - 找不到 gem railties (>= 0.a) (Gem::GemNotFoundException) - 2

    我已经看到了一些其他的问题,尝试了他们的建议,但没有一个对我有用。我已经使用Rails大约一年了,刚刚开始一个新的Rails项目,突然遇到了问题。我卸载并尝试重新安装所有Ruby和Rails。Ruby很好,但Rails不行。当我输入railss时,我得到了can'tfindgemrailties。我当前的Ruby版本是ruby2.2.2p95(2015-04-13修订版50295)[x86_64-darwin15],尽管我一直在尝试通过rbenv设置ruby​​2.3.0。如果我尝试rails-v查看我正在运行的版本,我会得到同样的错误。我使用的是MacOSXElCapitan版本10

随机推荐