问题标签 [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.

0 投票
3 回答
870 浏览

.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 时,返回一个已知与其他值冲突的值是否有效?我倾向于是的,因为上面的引用在这件事上是未定义的。

0 投票
2 回答
2849 浏览

.net - 为什么我们需要IEqualityComparer,IEqualityComparer界面?

'Equal' 和 'GetHashcode' 方法存在于对象类中,我们的类型继承了对象基类。直接实现对象的两种方法和使用 IComparer 接口有什么区别?

如果我们覆盖对象的 Equal 和 GetHashCode ,并推送到一个 hashtable ,它会使用覆盖的 equal 方法吗?

带有 IEqualityComparer 构造函数的新哈希表有什么不同?

0 投票
3 回答
1640 浏览

c# - 带有 Linq to XML 和 Distinct() 的 IEqualityComparer 不在代码中执行?

我在 Equals 方法中写什么并不重要。GetHashCode 总是被触发,但我不知道返回谁的 GetHashCode?

当调用 GetHashCode 方法时,变量 x 具有以下数据:

在第一个 unitName elementName 是值“这是我要比较的值” ...

0 投票
1 回答
519 浏览

c# - 您如何获得 WCF 序列化以在通用字典上保留非默认比较器?

假设我们在 Visual Studio 2010 中从头开始并添加一个“WCF 服务应用程序”。我们添加这个方法和实现:

然后我们向同一个解决方案添加一个新的“控制台应用程序”,向我们的服务项目添加一个服务引用(使用所有默认设置),并将此代码添加到Main

我们预计这段代码会失败,因为不区分大小写的字典会将keyandKEY视为同一个键,因此会抛出第二个Add.

不幸的是,当所有东西都编译并运行时,我们会看到一张悲伤的脸:(,因为当Dictionary遇到 WCF 层时,它会“忘记”它是使用特定的、非默认的,Comparer而是获取string默认的相等比较器。

是否有一个简单的设置可以更改,以便在穿过电线时保留其Comparer属性?Dictionary或者我必须创建一个自定义类?

(我已经看到了带有自定义 IEqualityComparer 的 Dictionary 的 XML 序列化,但它并没有给我太多启发。我还看到了 3 年前的这个 codeproject 评论,但这是我的问题,而不是答案)

0 投票
2 回答
141 浏览

linq - 为什么没有接受比较委托(或类似)的 Distinct() 重载

使用查询运算符 Distinct() 时,查询序列中的类型必须提供合适的 GetHashCode() 和 Equals() 重载,或者您必须传递 IEqualityComparer<T> 的实现。

我的问题:为什么 Distinct() 没有接受 Delegate 实例(例如,Comparison<T>)的重载?- 如果存在,则可以传递更轻量级的 lambda 表达式(比 IEqualityComparer<T> 的实现更轻量级)。- 我在这里错过了什么吗?

0 投票
2 回答
1492 浏览

c# - 如何使用键的自定义比较器从通用字典中获取值?

我有一个通用的对象字典,并希望使用自定义比较器来更新字典中的值。

myObjects包含对象字典,值是对象存在的次数。请注意,该值可能会使用不同的比较器多次递增或完全删除。

testObject是我的自定义对象。

customComparer是一个基于 testObject 类型动态变化的比较器。但所有比较器都是类型IEqualityComparer<MyObject>

我可以使用 Keys.Contains 来确定对象是否存在自定义比较器,但是我不确定如何更新值?

0 投票
2 回答
419 浏览

.net - 平等比较器.Default.Equals() 返回错误的结果还是什么?

除了 .NET Framework 中的错误之外,还有其他解释吗?该EqualityComparer<Uri>.Default.Equals()方法是说以下URL是相等的!

http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4249gTOh_GrDw&sa=X&oi=book_result&ct=result&resnum=3&ved=0CA0Q6AEwAg#v=onepage&q=弗莱彻_

http://books.google.com/books?id=B84KAQAAIAAJ&pg=PA29&lpg=PA29&dq=fletcher+sandford+tilton&source=bl&ots=ou8eF5REOG&sig=74fzA11Z8AENBtyCUcXEsXV06jQ&hl=en&ei=2rHTS9LaN4249gTOh_GrDw&sa=X&oi=book_result&ct=result&resnum=3&ved=0CA0Q6AEwAg#v=onepage&q=弗莱彻

请注意第一个空格末尾的“s”后面的空格。

0 投票
2 回答
885 浏览

c# - 创建一个不同的 iqueryable 列表

我有一个需要区分的对象列表 GroupStudentStatus。我写了下面的课程来做到这一点。
相关的 2 个属性是 GroupStudentStatus.IsLastActionRemoved (DateTime) 和 GroupStudentStatus.Student.Guid。

我认为这是对的,只是我不知道如何测试它。

我试图这样做:

0 投票
3 回答
467 浏览

c# - 关于 IEqualityComparer 的问题/ 列表。清楚的()

这是我刚刚编写的相等比较器,因为我想要来自包含实体的列表中的一组不同的项目。

  1. 为什么Distinct需要比较器而不是 a Func<T,T,bool>
  2. (A) 和 (B) 是不是优化以外的任何东西,是否存在由于比较参考的微妙性而无法按预期方式执行的情况?
  3. 如果我愿意,我可以将 (C) 替换为

    return GetHashCode(x) == GetHashCode(y)

0 投票
2 回答
6834 浏览

c# - 比较两个自定义对象(使用 IEqualityComparer)

首先,我会说我想比较以下内容:我的自定义对象(项目)有一个字符串列表taxids。我想查看一个列表中的所有字符串是否出现在另一个字符串列表中(也将是taxids另一个对象(项目)中的另一个。

所以,这是类:

然后这些是虚拟的自定义对象:

在这里,我使用自定义比较器ItemComparer。这是此的代码:

问题是该变量both在taxids 字段中没有任何内容,通常我应该有一个“5”“1”的列表。

我知道比较时 hashCode 必须相同。但taxids永远不会一样。因为我们在另一个字符串列表中查找字符串。

有人可以进一步帮助我解决这个问题吗?

(还有一个小问题:如果我总是为"a".GetHashCode()=> 之类的所有内容返回相同的哈希码,这是否可行?

提前致谢