问题标签 [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.
c# - IEnumerable.Except() 和自定义比较器
我在使用 except() 方法时遇到问题。它不返回差值,而是返回原始集合。
我尝试在 Account 类中实现 IEquatable 和 IEqualityComparer。我还尝试为 Account 创建一个单独的 IEqualityComparer 类。
当从 main 调用 except() 方法时,它似乎没有调用我自定义的 Equals() 方法,但是当我尝试 Count() 时,它确实调用了自定义 GetHashCode() 方法!
我确定我在某个地方犯了一个小错误,我希望一双新的眼睛可以帮助我。
主要的:
帐户:
Lambda比较器:
c# - 是否有完整的 IEquatable 实现参考?
我在这里关于 SO 的许多问题都与 IEquatable 实现有关。我发现它很难正确实现,因为在幼稚的实现中有很多隐藏的错误,而且我找到的关于它的文章也很不完整。我想找到或写一份明确的参考资料,其中必须包括:
- 如何正确实现 IEquatable
- 如何正确覆盖 Equals
- 如何正确覆盖 GetHashCode
- 如何正确实现 ToString 方法
- 如何正确实现运算符 ==
- 如何正确实现运算符 !=
这么完整的参考文献已经存在了?
PS:即使是MSDN 参考对我来说似乎也有缺陷
c# - 不同的是不使用 LINQ to Objects
这是基于“LINQ in Action”中的一个示例。清单 4.16。
这会打印 Jon Skeet 两次。为什么?我什至尝试在 Author 类中覆盖 Equals 方法。Still Distinct 似乎不起作用。我错过了什么?
编辑:我也添加了 == 和 != 运算符重载。仍然没有帮助。
vb.net - VB.Net IEquatable,拒绝访问
我的项目中只有一个简单的接口定义,我什至还没有使用过。但是当我尝试构建项目时,我得到了这个错误:
访问被拒绝:'System.IEquatable`1[Reactor.IOptions]'。
下面是界面:
有任何想法吗?
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 个输入项的组。
为什么分组不起作用?
c# - 应该 IEquatable, 可比在非密封类上实施?
任何人对是否或IEquatable<T>
应该IComparable<T>
通常要求T
是sealed
(如果是class
)有任何意见吗?
这个问题出现在我身上,因为我正在编写一组旨在帮助实现不可变类的基类。基类旨在提供的部分功能是相等比较的自动实现(使用类的字段以及可应用于字段以控制相等比较的属性)。完成后应该会很不错 - 我正在使用表达式树为 each 动态创建编译比较函数T
,因此比较函数应该非常接近常规相等比较函数的性能。(我正在使用一个不可变的字典键控System.Type
和双重检查锁定来以合理的方式存储生成的比较函数)
但是,出现的一件事是使用什么函数来检查成员字段的相等性。我最初的意图是检查每个成员字段的类型(我将称之为X
)是否实现IEquatable<X>
。但是,经过一番思考,我不认为这是安全的,除非X
is sealed
。原因是 if X
is not sealed
,我不能确定 ifX
是否适当地将相等检查委托给虚拟方法 on X
,从而允许子类型覆盖相等比较。
这就提出了一个更普遍的问题——如果一个类型不是密封的,它真的应该实现这些接口吗?我认为不会,因为我认为接口契约是在两种X
类型之间进行比较,而不是两种可能存在或不存在的类型X
(尽管它们当然必须X
是子类型或子类型)。
你们有什么感想?是否应该避免非密封类IEquatable<T>
?IComparable<T>
(也让我想知道是否有针对此的 fxcop 规则)
我目前的想法是让我生成的比较函数仅用于isIEquatable<T>
的成员字段,而不是使用 virtual if即使实现也是未密封的,因为该字段可能存储子类型,我怀疑大多数实现的设计是否适合继承.T
sealed
Object.Equals(Object obj)
T
T
IEquatable<T>
T
IEquatable<T>
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<> ,但我希望得到不同的答案。
谢谢
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()
有问题?
c# - C# Linq 扩展方法如何执行相等比较?
因此,以下 lambda 表达式不会返回集合中的任何元素,即使在单步执行时我能够验证 1 项是否符合条件。我添加了一个带有 IEquatable 实现的类示例。
上面没有返回任何内容。关于如何使上述表达式起作用的任何建议?
为了确保我没有发疯,我创建了以下通过的 nUnit 测试:
尝试覆盖 == 和 !=:
c# - IComparable 和 IEquatable 接口有什么区别?
两个接口似乎都比较对象是否相等,那么它们之间的主要区别是什么?