问题标签 [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 投票
2 回答
21222 浏览

c# - 了解 IEquatable

当我实现要使用IEquatable<T>接口比较的对象时:

  1. 如果我已经实现了,为什么我必须重写Equals(object)方法Equals(T)
  2. 实施后可以使用==and!=运算符IEquatable<T>吗?
0 投票
1 回答
485 浏览

c# - 是否可以通过比较项目的属性来自动处理 List.Contains?

我们可以做一些类似的事情List.Contains(myItem)来检查列表中某个项目的属性是否等于myItem.

(我们已经考虑过ContainsExists,类似于:

但无法得到简单的表达。)

我们想要如下简单的东西:

如果至少有一项orderLines[i]满足,则此方法应自动返回 true:

我们已经实现IEquatable<OrderLine>了which equals by the Productproperty,但找不到从那里开始的方法。

0 投票
5 回答
1386 浏览

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 计算中使用类的所有字段将导致类似的无限递归和堆栈溢出问题。


问题

如何检查两个具有双向关联的对象之间的值相等而不导致堆栈溢出?


代码

注意:此代码仅用于显示问题,而不是演示我正在使用的遇到此问题的实际类设计

0 投票
3 回答
1398 浏览

c# - 对于引用类型如何使用 IEquatable减少铸件的使用?

我读过几篇文章

使用 IEquatable 的引用类型减少了强制转换的使用

有人可以提供一个令人信服的例子。

0 投票
4 回答
3566 浏览

c# - 我应该使用我的字符串字段的串联作为哈希码吗?

我在 C# 中有一个 Address 类,如下所示:

我正在实现平等,所以我需要覆盖哈希码。起初我打算使用 EJ 的哈希码公式,但后来我想:这些都是字符串字段,我不能只使用 StringBuilder 连接它们并从该字符串返回哈希码吗?

那是:

这样做的优点/缺点是什么?为什么我不应该这样做?

0 投票
2 回答
2854 浏览

c# - Equals 方法实现助手 (C#)

每次我写一些数据类时,我通常都会花很多时间来编写 IEquatable 实现。

我写的最后一节课是这样的:

实施 IEquatable 非常麻烦。当然 C#3.0/LINQ 有很大帮助,但是顶点可以移动和/或以相反的顺序移动,这给 Equals 方法增加了很多复杂性。经过多次单元测试和相应的实现,我放弃了,并将我的应用程序改为只接受三角形,而 IEquatable 实现只需要 11 个单元测试就可以完全覆盖。

有什么工具或技术可以帮助实现 Equals 和 GetHashCode?

0 投票
8 回答
5191 浏览

c# - IEquatable 接口在检查 null 时要做什么

我已经使用以下代码在一个类中实现了 IEquatable 接口。

此代码适用于大多数情况。但是,以下检查会在等式运算符重载方法中引发异常,因为 a 为 null,因此没有 Equals 方法。

解决此问题的标准方法是什么?

编辑

我已经去了这个,但它似乎很麻烦。我希望有一种更优雅的方式来实现这一点。

解决方案

谢谢大家。我从每个人那里得到了很多好的建议,我真的很感激。这就是我最终确定的,它比我开始的要优雅得多。除了运算符重载之外,所有代码都是相同的。

0 投票
2 回答
5296 浏览

c# - 我应该如何实现 Object.GetHashCode() 来实现复杂的相等性?

基本上,到目前为止,我有以下内容:

所以,问题是这样的:我有一个非必填字段Guid,它是一个唯一标识符。如果没有设置,那么我需要尝试根据不太准确的指标来确定相等性,以尝试确定两个对象是否相等。这工作正常,但它使GetHashCode()混乱......我应该怎么做?一个天真的实现是这样的:

但是这两种类型的哈希冲突的可能性有多大?当然,我不希望它是1 in 2 ** 32。这是一个坏主意,如果是这样,我应该怎么做?

0 投票
4 回答
733 浏览

.net - 当空间大于 32 位时,如何实现 GetHashCode 兼容的 Equals 方法?

在 .NET 中,您需要 Equals(object) 和 GetHashCode() 兼容。但有时你不能:

因为数据密度大于 32 位,并且 GetHashCode 返回一个 Int32,所以您将有 3 个解决方案(假设正确实现了 GetHashCode):

  1. 避免代码重复 因为不正确而被丢弃

    /li>
  2. 与 GetHashCode() 分开实现 Equals

    /li>
  3. 实现精度更高的GetHashCode64,覆盖的GetHashCode(32位)会返回(int)GetHashCode64(),Equals会返回this.GetHashCode64() == other.GetHashCode64()

你会实施哪一个?

第一个解决方案不精确,但更清洁。第二个选项看起来很干净,但是当类具有更多属性时会变得非常复杂。第三种选择是妥协。

0 投票
8 回答
336 浏览

c# - 如何处理相等比较中的空值?

当我必须为

我应该做

错误的?

还有呢

它也应该是假的吗?

更新人们质疑这个问题背后的原因。假设 != 和 == 总是相反的。但是,如果我实现这些方法以使上述所有比较结果为假,那么在某些情况下 == 和 != 运算符将产生相同的结果。所以 != 应该返回 true 还是 false 是一个两难的问题。