问题标签 [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# - 了解 IEquatable
当我实现要使用IEquatable<T>
接口比较的对象时:
- 如果我已经实现了,为什么我必须重写
Equals(object)
方法Equals(T)
? - 实施后可以使用
==
and!=
运算符IEquatable<T>
吗?
c# - 是否可以通过比较项目的属性来自动处理 List.Contains?
我们可以做一些类似的事情List.Contains(myItem)
来检查列表中某个项目的属性是否等于myItem
.
(我们已经考虑过Contains
和Exists
,类似于:
但无法得到简单的表达。)
我们想要如下简单的东西:
如果至少有一项orderLines[i]
满足,则此方法应自动返回 true:
我们已经实现IEquatable<OrderLine>
了which equals by the Product
property,但找不到从那里开始的方法。
c# - C#中具有双向关联的价值平等
背景
在我正在处理的 C# 项目中,我有两个对象之间具有双向关联。由于多种原因(例如,在集合中使用它们),我需要能够检查值相等(与引用相等),因此我正在实现 IEquatable 和相关功能。
假设
- 我正在使用 C# 3.0、.NET 3.5 和 Visual Studio 2008(尽管对于相等比较例程问题应该无关紧要)。
约束
任何解决方案都必须:
- 允许双向关联保持不变,同时允许检查值相等。
- 允许类的外部使用从 IEquatable 调用 Equals(Object obj) 或 Equals(T class) 并接收正确的行为(例如在 System.Collections.Generic 中)。
问题
在实现 IEquatable 以检查具有双向关联的类型的值相等时,会发生无限递归,从而导致堆栈溢出。
注意:类似地,在 GetHashCode 计算中使用类的所有字段将导致类似的无限递归和堆栈溢出问题。
问题
如何检查两个具有双向关联的对象之间的值相等而不导致堆栈溢出?
代码
注意:此代码仅用于显示问题,而不是演示我正在使用的遇到此问题的实际类设计
c# - 对于引用类型如何使用 IEquatable减少铸件的使用?
我读过几篇文章
使用 IEquatable 的引用类型减少了强制转换的使用
有人可以提供一个令人信服的例子。
c# - 我应该使用我的字符串字段的串联作为哈希码吗?
我在 C# 中有一个 Address 类,如下所示:
我正在实现平等,所以我需要覆盖哈希码。起初我打算使用 EJ 的哈希码公式,但后来我想:这些都是字符串字段,我不能只使用 StringBuilder 连接它们并从该字符串返回哈希码吗?
那是:
这样做的优点/缺点是什么?为什么我不应该这样做?
c# - Equals 方法实现助手 (C#)
每次我写一些数据类时,我通常都会花很多时间来编写 IEquatable 实现。
我写的最后一节课是这样的:
实施 IEquatable 非常麻烦。当然 C#3.0/LINQ 有很大帮助,但是顶点可以移动和/或以相反的顺序移动,这给 Equals 方法增加了很多复杂性。经过多次单元测试和相应的实现,我放弃了,并将我的应用程序改为只接受三角形,而 IEquatable 实现只需要 11 个单元测试就可以完全覆盖。
有什么工具或技术可以帮助实现 Equals 和 GetHashCode?
c# - IEquatable 接口在检查 null 时要做什么
我已经使用以下代码在一个类中实现了 IEquatable 接口。
此代码适用于大多数情况。但是,以下检查会在等式运算符重载方法中引发异常,因为 a 为 null,因此没有 Equals 方法。
解决此问题的标准方法是什么?
编辑
我已经去了这个,但它似乎很麻烦。我希望有一种更优雅的方式来实现这一点。
解决方案
谢谢大家。我从每个人那里得到了很多好的建议,我真的很感激。这就是我最终确定的,它比我开始的要优雅得多。除了运算符重载之外,所有代码都是相同的。
c# - 我应该如何实现 Object.GetHashCode() 来实现复杂的相等性?
基本上,到目前为止,我有以下内容:
所以,问题是这样的:我有一个非必填字段Guid
,它是一个唯一标识符。如果没有设置,那么我需要尝试根据不太准确的指标来确定相等性,以尝试确定两个对象是否相等。这工作正常,但它使GetHashCode()
混乱......我应该怎么做?一个天真的实现是这样的:
但是这两种类型的哈希冲突的可能性有多大?当然,我不希望它是1 in 2 ** 32
。这是一个坏主意,如果是这样,我应该怎么做?
.net - 当空间大于 32 位时,如何实现 GetHashCode 兼容的 Equals 方法?
在 .NET 中,您需要 Equals(object) 和 GetHashCode() 兼容。但有时你不能:
因为数据密度大于 32 位,并且 GetHashCode 返回一个 Int32,所以您将有 3 个解决方案(假设正确实现了 GetHashCode):
/li>避免代码重复因为不正确而被丢弃与 GetHashCode() 分开实现 Equals
/li>实现精度更高的GetHashCode64,覆盖的GetHashCode(32位)会返回(int)GetHashCode64(),Equals会返回this.GetHashCode64() == other.GetHashCode64()
你会实施哪一个?
第一个解决方案不精确,但更清洁。第二个选项看起来很干净,但是当类具有更多属性时会变得非常复杂。第三种选择是妥协。
c# - 如何处理相等比较中的空值?
当我必须为
我应该做
和
和
错误的?
还有呢
它也应该是假的吗?
更新人们质疑这个问题背后的原因。假设 != 和 == 总是相反的。但是,如果我实现这些方法以使上述所有比较结果为假,那么在某些情况下 == 和 != 运算符将产生相同的结果。所以 != 应该返回 true 还是 false 是一个两难的问题。