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

c# - 如何为抽象基类实现相等?

我正在遵循MSDN 的价值平等指南,我发现了一个文档没有涵盖的案例,即基类的平等。

一点背景:

我正在开发麻将游戏(4 人,不匹配),并且正在定义牌。牌可以分为两组:套装,有一个与之相关的数字(并且可以按顺序放在一起,如 2-3-4)和荣誉牌,没有编号。

这是我到目前为止所拥有的:

对于大部分代码,我想通过基类引用磁贴,例如:

我的问题:我应该如何在MahjongTile基类中定义平等?

0 投票
2 回答
1572 浏览

c# - 如何在 C# 中实现多类型 IComparable / IEquatable

假设我有以下课程:

如果我想让我的课程与 a 相媲美,我double应该以这种方式包含IComparable<double>并实现它,还是必须以另一种方式进行?

当我希望我的班级与双打相当时,应该double.CompareTo给出与ScaleValue.CompareTo

怎么样Equals

我认为我在设计中把责任放在了错误的地方。我认为我最好的选择是使用ContainsValue(double Value)方法制作 Scale 类。通过这种方式,我可以查找价值并将责任保留在需要的地方。

0 投票
2 回答
1096 浏览

c# - 平等比较器.Default.Equals() vs object.Equals() 和多态性

再次讨论平等我偶然发现EqualityComparer<T>.Default.Equals()。我更喜欢将此方法称为引用类型而不是object.Equals().
现在我觉得我大错特错了。

object.Equals()使用可覆盖的实例Equals()方法来提供正确的多态行为,而在实现时EqualityComparer<T>.Default.Equals()调用。IEquatable<T>.Equals()

现在考虑这个小程序:

它显示了在相等语义中带来不一致是多么容易:

Object.Equals()
C1=C2 False
C2=C1 False
C2=C3 False
C3=C2 False

EqualityComparer<Class1>.Default.Equals
C1=C2 False
C2=C1 False
C2=C3 True BUG?
C3=C2 真正的BUG?

但是MSDN 文档建议:

给实现者的注意事项 如果您实现 Equals,您还应该重写 Object.Equals(Object) 和 GetHashCode 的基类实现,以便它们的行为与 IEquatable<T>.Equals 方法的行为一致。如果您确实重写了 Object.Equals(Object),那么在调用类上的静态 Equals(System.Object, System.Object) 方法时也会调用您重写的实现。此外,您应该重载 op_Equality 和 op_Inequality 运算符。这可确保所有相等性测试返回一致的结果,如示例所示。

从这一刻开始,我认为没有理由IEquatable<T>为引用类型实现。谁能告诉我什么时候有任何意义?当我们以不同的方式看待类型(作为基本类型)时,我真的应该将不同的平等行为视为不一致吗?

0 投票
2 回答
735 浏览

c# - 使用 IEquatable Equals,比较数组中对象的属性

我正在尝试在经典的扑克/纸牌游戏类型程序中进行同花顺。属性是花色(红心、钻石等),数组是手。我使用了 IEquatable 并实现了 Equals 方法

从那里开始,在我的 Program.cs 中,我正在使用 .Equals 为 Flush 编写一个 bool 方法。有人建议我使用 for 循环,但我无法理解我是否正确执行此操作。我需要逐卡比较 cardSuit 属性。但我不确定如何去做。任何帮助,将不胜感激。到目前为止,这是我在方法中所拥有的。

在我看来,for 循环会比较每张卡片以查找任何假的,如果是则返回假。在 for 循环之外/之后(假设它们都是真的),我返回手中最后两张牌比较的真/假。我把它复杂化了吗?这是错的吗?

编辑:我可以看到:“if (hand[i].Equals(hand[i + 1]) == false)”会超出范围异常,所以我需要一种新的方法来比较卡片与卡片。有任何想法吗?

0 投票
1 回答
1529 浏览

c# - 当 ==、CompareTo() 和 Equals() 不一致时会发生什么?

我有一个几年前写的程序,用来为字节找到“好的”二进制运算符;byteA左乘 byteB得到 byte C。运算符定义为 256x256 字节矩阵。A类实现的精简版本如下。

Equals()为真 IFF 数组中的所有 65536 个字节都相同。

CompareTo()将运算符的线性度与线性度更高(对加密不利)与线性度更低(对加密有利)的连续体进行比较。

因此,对于两个实例AB,以下两个都为真是可能的:

我的问题更少:这是个好主意吗?我知道答案是否定的,但考虑到测量线性度的巨大计算成本和我的问题的狭窄性质,这个设计是可行的。代码也类似于:

我更容易阅读。

我的问题是:==、CompareTo()== 0和之间的这种分歧的后果是什么Equals()?或者:是否有描述哪个扩展使用哪个接口的 LINQ 扩展方法列表(IEquatableIComparable)的哪些 LINQ 扩展方法的列表?

比这篇 MSDN 文章更简洁的东西Enumerable

例如:

Equals(BinaryOperator)按以下方式调用: Enumerable.Distinct<TSource>Method as does Contains()。我明白这一点Sort()OrderBy()使用对CompareTo().

但是FindFirst()BinarySearch()呢?

我的示例类:

0 投票
1 回答
526 浏览

c# - 我的 IEquatable 仍在使用 Object.GetHashcode 作为 Dictionary[]

我有类似以下内容作为通用字典的键。

据我了解EqualityComparer<T>.Default,它应该看到我已经实现IEquatable<T>并因此动态创建了一个 EqualityComparer。

Dictionary<TKey, TValue>需要一个相等实现来确定键是否相等。如果 comparer 为 null,则此构造函数使用默认的泛型相等比较器 EqualityComparer<T>.Default. 如果 typeTKey实现了 System.IEquatable<T>泛型接口,则默认相等比较器使用该实现。

但是从我看到的使用字典索引器的情况来看Dictionary<T>[],它仍然依赖于覆盖 GetHashcode,例如public override int GetHashCode()

我可以看到有建议覆盖很多以保持一致性,但我试图更多地理解它。是因为 IEquatable 应该直接位于 MyClass 而不是 IMyClass 中吗?但我更喜欢在 IMyClass 上使用它,因此实现者需要成为字典键。

我正在尝试使用 IEqualityComparer,但据我所知,我不需要它。

0 投票
2 回答
85 浏览

c# - 比较列表与另一个列表

我一直在阅读如何将列表与另一个列表进行比较。我试图实现IEquatable接口。这是我到目前为止所做的:

这就是我使用它的地方:

现在,当我调试并在 equals 函数中放置一个断点时,它永远不会被击中。

这让我认为我没有正确实现它或者我没有正确调用它?

0 投票
1 回答
5316 浏览

c# - 由于对象的当前状态,IEquatable 操作无效

我正在用 C# 开发一个项目我最近遇到了一个我无法理解的错误。

首先这里是核心

这是导致问题的 getGroupe 函数:

因此,在某些随机时刻,当移动完成时,由于对象的当前状态,我得到 IEquatable 操作无效。这是堆栈跟踪:

所以第 142 行是

和 155 是

我不明白,因为 this.Groupes 在开始时只是空的。我做了一个测试,在寻找组之前检查它是否为空,但它没有改变任何东西......

0 投票
1 回答
6747 浏览

c# - IEquatable 的类实现,用作字典中的键

我有一个由两个字符串和一个枚举组成的类。我正在尝试将此类的实例用作字典中的键。不幸的是,我似乎没有正确实施 IEquatable。这是我的做法:

但是,我似乎仍然无法在我的字典中查找项目。此外,以下测试失败:

有人能指出我哪里出错了吗?我确定我错过了一些相当简单的东西,但我不确定是什么。

0 投票
2 回答
1999 浏览

c# - IEquatable 实现和运算符覆盖

域类T可以是类型ValueObject<T>

ValueObject<T>实现IEquatable接口。我希望 的每个具体实现都ValueObject<T>为 提供实现bool Equals(T obj),因此我将其创建为抽象方法:

类中的 Equals 实现Coordinate

ValueObject<T>为 ==(和 !=,上面未显示)提供通用操作覆盖,适用于所有具体实现。

问题是,当Equals从 == 覆盖调用该方法时,它调用Object.Equals()而不是Coordinate.Equals().