问题标签 [iequatable]

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 投票
4 回答
6713 浏览

c# - IEnumerable.Except() 和自定义比较器

我在使用 except() 方法时遇到问题。它不返回差值,而是返回原始集合。

我尝试在 Account 类中实现 IEquatable 和 IEqualityComparer。我还尝试为 Account 创建一个单独的 IEqualityComparer 类。

当从 main 调用 except() 方法时,它似乎没有调用我自定义的 Equals() 方法,但是当我尝试 Count() 时,它确实调用了自定义 GetHashCode() 方法!

我确定我在某个地方犯了一个小错误,我希望一双新的眼睛可以帮助我。

主要的:

帐户:

Lambda比较器:

0 投票
5 回答
22678 浏览

c# - 是否有完整的 IEquatable 实现参考?

我在这里关于 SO 的许多问题都与 IEquatable 实现有关。我发现它很难正确实现,因为在幼稚的实现中有很多隐藏的错误,而且我找到的关于它的文章也很不完整。我想找到或写一份明确的参考资料,其中必须包括:

  • 如何正确实现 IEquatable
  • 如何正确覆盖 Equals
  • 如何正确覆盖 GetHashCode
  • 如何正确实现 ToString 方法
  • 如何正确实现运算符 ==
  • 如何正确实现运算符 !=

这么完整的参考文献已经存在了?

PS:即使是MSDN 参考对我来说似乎也有缺陷

0 投票
10 回答
114093 浏览

c# - 不同的是不使用 LINQ to Objects

这是基于“LINQ in Action”中的一个示例。清单 4.16。

这会打印 Jon Skeet 两次。为什么?我什至尝试在 Author 类中覆盖 Equals 方法。Still Distinct 似乎不起作用。我错过了什么?

编辑:我也添加了 == 和 != 运算符重载。仍然没有帮助。

0 投票
1 回答
260 浏览

vb.net - VB.Net IEquatable,拒绝访问

我的项目中只有一个简单的接口定义,我什至还没有使用过。但是当我尝试构建项目时,我得到了这个错误:

访问被拒绝:'System.IEquatable`1[Reactor.IOptions]'。

下面是界面:

有任何想法吗?

0 投票
2 回答
11557 浏览

linq - Linq GroupBy 使用 Default EqualityComparer 的主要比较

我正在尝试使用显式键类型对某些对象执行 Linq GroupBy。我没有将一个传递IEqualityComparer给 GroupBy,所以根据文档:

默认相等比较器Default用于比较键。

它解释了EqualityComparer<T>.Default这样的属性:

Default属性检查 type 是否T实现了 System.IEquatable<T>泛型接口,如果是,则返回 EqualityComparer<T>使用该实现的一个。

在下面的代码中,我将一组Fred对象分组。它们有一个名为 的键类型FredKey,它实现了IEquatable<FredKey>.

这应该足以使分组工作,但分组不起作用。在下面的最后一行中,我应该有 2 个组,但我没有,我只有 3 个包含 3 个输入项的组。

为什么分组不起作用?

0 投票
4 回答
5593 浏览

c# - 应该 IEquatable, 可比在非密封类上实施?

任何人对是否或IEquatable<T>应该IComparable<T>通常要求Tsealed(如果​​是class)有任何意见吗?

这个问题出现在我身上,因为我正在编写一组旨在帮助实现不可变类的基类。基类旨在提供的部分功能是相等比较的自动实现(使用类的字段以及可应用于字段以控制相等比较的属性)。完成后应该会很不错 - 我正在使用表达式树为 each 动态创建编译比较函数T,因此比较函数应该非常接近常规相等比较函数的性能。(我正在使用一个不可变的字典键控System.Type和双重检查锁定来以合理的方式存储生成的比较函数)

但是,出现的一件事是使用什么函数来检查成员字段的相等性。我最初的意图是检查每个成员字段的类型(我将称之为X)是否实现IEquatable<X>。但是,经过一番思考,我不认为这是安全的,除非Xis sealed。原因是 if Xis not sealed,我不能确定 ifX是否适当地将相等检查委托给虚拟方法 on X,从而允许子类型覆盖相等比较。

这就提出了一个更普遍的问题——如果一个类型不是密封的,它真的应该实现这些接口吗?我认为不会,因为我认为接口契约是在两种X类型之间进行比较,而不是两种可能存在或不存在的类型X(尽管它们当然必须X是子类型或子类型)。

你们有什么感想?是否应该避免非密封类IEquatable<T>IComparable<T>(也让我想知道是否有针对此的 fxcop 规则)

我目前的想法是让我生成的比较函数仅用于isIEquatable<T>的成员字段,而不是使用 virtual if即使实现也是未密封的,因为该字段可能存储子类型,我怀疑大多数实现的设计是否适合继承.TsealedObject.Equals(Object obj)TTIEquatable<T>TIEquatable<T>

0 投票
2 回答
1673 浏览

c# - 如何在覆盖 GetHashCode() 的类型上使用 Object.GetHashCode()

我有一个实现 IEquatable<> 的 A 类,使用它的字段(比如 Ab 和 Ac)来实现/覆盖 Equals() 和覆盖 GetHashCode(),99% 的时间一切正常。类 A 是继承自接口 D 的层次结构(类 B、C)的一部分;它们都可以一起存储在字典 Dictionary 中,因此当它们都带有自己的默认 Equals()/GetHashCode() 时会很方便。

但是,在构建 AI 时,有时需要做一些工作来获取 Ab 和 Ac 的值;在发生这种情况时,我想存储对正在构建的实例的引用。在这种情况下,我不想使用 A 提供的默认 Equals()/GetHashCode() 覆盖。因此,我正在考虑实现一个 ReferenceEqualityComparer,这意味着强制使用 Object 的 Equals()/GetHashCode() :

问题是,由于 A 覆盖了 Object.GetHashCode(),我如何(在 A 之外)为 A 的实例调用 Object.GetHashCode()?

一种方法当然是 A 不实现 IEquatable<> 并始终向我创建的任何字典提供 IEqualityComparer<> ,但我希望得到不同的答案。

谢谢

0 投票
2 回答
1356 浏览

c# - C# XNA:字典的问题

我是 C# 的新手。也许我没有IEquatable正确实现,因为我的类型的对象应该被认为是相同的。

班上:

(除了这之外,还有更多的CompPoint东西可以证明它是一个类。)

然后,此测试失败:

我有什么误解?是否Assert.AreEqual()使用参照平等?我的Equals()功能有问题CompPoint吗?

此功能也失败:

这样做的原因是我正在使用 a Dictionary,并且它没有按照我希望的方式工作:

测试失败并显示以下消息:

测试方法 ShipAILabTest.BoardUtilsTest.dictCompPointTest 抛出异常:System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键。

这个测试概括了我的期望。我希望由于密钥每次都相同,因此该值将被覆盖。Dictionary测试相等性的用途是什么?

更新:根据 Thomas 的建议,我添加了一个相等函数,现在CompPoint比较测试有效,并且dictCompPointTest有效。

奇怪的是,这个测试仍然失败:

当键是时测试也会失败,但当键是new CompPoint(4, 1)时不会new CompPoint(0, 1)。为什么这可能适用于某些价值观而不适用于其他价值观?

更神秘的是:哈希码函数似乎工作得很糟糕。此测试失败:

上面列出了哈希码函数。这里有什么问题?这两个CompPoint对象不应该具有相同的哈希码吗?也许我的电话base.getHashCode()有问题?

0 投票
4 回答
2089 浏览

c# - C# Linq 扩展方法如何执行相等比较?

因此,以下 lambda 表达式不会返回集合中的任何元素,即使在单步执行时我能够验证 1 项是否符合条件。我添加了一个带有 IEquatable 实现的类示例。

上面没有返回任何内容。关于如何使上述表达式起作用的任何建议?

为了确保我没有发疯,我创建了以下通过的 nUnit 测试:

尝试覆盖 == 和 !=:

0 投票
5 回答
20974 浏览

c# - IComparable 和 IEquatable 接口有什么区别?

两个接口似乎都比较对象是否相等,那么它们之间的主要区别是什么?