问题标签 [iequalitycomparer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - IEqualityComparer当项目不相等时,GetHashCode 返回相同的值?
在接口GetHashCode
方法的文档中的“实现者注释”部分中,它指出:IEqualityComparer<T>
实现需要确保如果 Equals 方法为两个对象 x 和 y 返回 true,则 GetHashCode 方法为 x 返回的值必须等于为 y 返回的值。
众所周知T
,如果两个项目相等,您为什么希望两个实例返回相同的哈希码;它们不同意味着它们不相等,而它们相同则意味着它们可能相等。
当两个实例不相等时,我将返回值的引号解释为未定义(即使它们的值可能表明如此)。
以以下为例。我有一个序列int?
,我想将其用于统计分类,其中每个非空值int?
代表一个类的一个属性(想想枚举值)。在这些值为空的情况下,您不希望将这些值视为相等,因为它们会使训练集偏向于缺失值。如果有的话,在这种情况下,与其他空值相比,您希望空值返回 false。
问题是,在该GetHashCode
方法中,当给定 null 时,我可能想要返回 0 (或其他一些数字,也许Int32.MinValue
)。现在,我知道当使用此IEqualityComparer<T>
实现键入任何内容时,检查字典中是否存在键的性能对于这些情况不会是最佳的。
也就是说GetHashCode
,当调用Equals
返回 false 时,返回一个已知与其他值冲突的值是否有效?我倾向于是的,因为上面的引用在这件事上是未定义的。
.net - 为什么我们需要IEqualityComparer,IEqualityComparer界面?
'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。直接实现对象的两种方法和使用 IComparer 接口有什么区别?
如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?
带有 IEqualityComparer 构造函数的新哈希表有什么不同?
c# - 带有 Linq to XML 和 Distinct() 的 IEqualityComparer 不在代码中执行?
我在 Equals 方法中写什么并不重要。GetHashCode 总是被触发,但我不知道返回谁的 GetHashCode?
当调用 GetHashCode 方法时,变量 x 具有以下数据:
在第一个 unitName elementName 是值“这是我要比较的值” ...
c# - 您如何获得 WCF 序列化以在通用字典上保留非默认比较器?
假设我们在 Visual Studio 2010 中从头开始并添加一个“WCF 服务应用程序”。我们添加这个方法和实现:
然后我们向同一个解决方案添加一个新的“控制台应用程序”,向我们的服务项目添加一个服务引用(使用所有默认设置),并将此代码添加到Main
:
我们预计这段代码会失败,因为不区分大小写的字典会将key
andKEY
视为同一个键,因此会抛出第二个Add
.
不幸的是,当所有东西都编译并运行时,我们会看到一张悲伤的脸:(
,因为当Dictionary
遇到 WCF 层时,它会“忘记”它是使用特定的、非默认的,Comparer
而是获取string
默认的相等比较器。
是否有一个简单的设置可以更改,以便在穿过电线时保留其Comparer
属性?Dictionary
或者我必须创建一个自定义类?
(我已经看到了带有自定义 IEqualityComparer 的 Dictionary 的 XML 序列化,但它并没有给我太多启发。我还看到了 3 年前的这个 codeproject 评论,但这是我的问题,而不是答案)
linq - 为什么没有接受比较委托(或类似)的 Distinct() 重载
使用查询运算符 Distinct() 时,查询序列中的类型必须提供合适的 GetHashCode() 和 Equals() 重载,或者您必须传递 IEqualityComparer<T> 的实现。
我的问题:为什么 Distinct() 没有接受 Delegate 实例(例如,Comparison<T>)的重载?- 如果存在,则可以传递更轻量级的 lambda 表达式(比 IEqualityComparer<T> 的实现更轻量级)。- 我在这里错过了什么吗?
c# - 如何使用键的自定义比较器从通用字典中获取值?
我有一个通用的对象字典,并希望使用自定义比较器来更新字典中的值。
myObjects
包含对象字典,值是对象存在的次数。请注意,该值可能会使用不同的比较器多次递增或完全删除。
testObject
是我的自定义对象。
customComparer
是一个基于 testObject 类型动态变化的比较器。但所有比较器都是类型IEqualityComparer<MyObject>
我可以使用 Keys.Contains 来确定对象是否存在自定义比较器,但是我不确定如何更新值?
.net - 平等比较器.Default.Equals() 返回错误的结果还是什么?
除了 .NET Framework 中的错误之外,还有其他解释吗?该EqualityComparer<Uri>.Default.Equals()
方法是说以下URL是相等的!
和
请注意第一个空格末尾的“s”后面的空格。
c# - 创建一个不同的 iqueryable 列表
我有一个需要区分的对象列表 GroupStudentStatus。我写了下面的课程来做到这一点。
相关的 2 个属性是 GroupStudentStatus.IsLastActionRemoved (DateTime) 和 GroupStudentStatus.Student.Guid。
我认为这是对的,只是我不知道如何测试它。
我试图这样做:
c# - 关于 IEqualityComparer 的问题/ 列表。清楚的()
这是我刚刚编写的相等比较器,因为我想要来自包含实体的列表中的一组不同的项目。
- 为什么
Distinct
需要比较器而不是 aFunc<T,T,bool>
? - (A) 和 (B) 是不是优化以外的任何东西,是否存在由于比较参考的微妙性而无法按预期方式执行的情况?
如果我愿意,我可以将 (C) 替换为
return GetHashCode(x) == GetHashCode(y)
c# - 比较两个自定义对象(使用 IEqualityComparer)
首先,我会说我想比较以下内容:我的自定义对象(项目)有一个字符串列表taxids
。我想查看一个列表中的所有字符串是否出现在另一个字符串列表中(也将是taxids
另一个对象(项目)中的另一个。
所以,这是类:
然后这些是虚拟的自定义对象:
在这里,我使用自定义比较器ItemComparer
。这是此的代码:
问题是该变量both
在taxids 字段中没有任何内容,通常我应该有一个“5”“1”的列表。
我知道比较时 hashCode 必须相同。但taxids
永远不会一样。因为我们在另一个字符串列表中查找字符串。
有人可以进一步帮助我解决这个问题吗?
(还有一个小问题:如果我总是为"a".GetHashCode()
=> 之类的所有内容返回相同的哈希码,这是否可行?
提前致谢