问题标签 [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 回答
194 浏览

c# - IEquatable - 覆盖 Equals - 检查空值

我有一个IEquatable<T>方法:

但我需要做的是为其中的各个位添加一些空值检查,因为目前它会抛出一个 nullreferenceexception 是否有一些巧妙的方法可以做到这一点,所以它最终不会变成一个令人讨厌的混乱?往返旅行类型是枚举,并且始终设置为先检查它们。out 和 back free 是布尔值,旅行点是整数,其余都是字符串。只是觉得如果我开始必须检查空值会变得非常混乱,除非有一些速记方法吗?

谢谢

0 投票
2 回答
4460 浏览

c# - 使用结构作为字典的键和奇怪的东西正在发生

这是我的结构...

我将这些用作字典的键,但我认为它们不能正确地相互等同。字典中的值是具有 bool 字段的对象。我有一个while循环对它们做一些事情并将bool更改为true,直到它们全部为true..它陷入无限循环,因为它们永远不会变为true..奇怪的是我没有超出范围错误或类似的东西,当我调试更改布尔值的位时,它似乎工作正常,但是当我在调试中查看字典时,所有布尔值仍然是错误的

(注意:我使用元组作为键,但我制作了这个结构,所以我可以轻松地相乘和相加)

我只是想和你确认一下...

那两次我访问字典时我访问的是同一个值对象?

编辑:这是字典中的值结构(我替换了上面的“东西”)

0 投票
2 回答
559 浏览

c# - 何时指定约束 `T : IEquatable`即使不是严格要求?

简而言之,我正在寻找关于以下两种方法中的哪一种应该优先(以及为什么)的指导:

  • 赞成的论点DistinctA:显然,约束 onT不是必需的,因为HashSet<T>不需要它,并且因为 any 的实例T保证可转换为,它提供与(即两个方法和)System.Object相同的功能。(虽然非泛型方法会导致值类型的装箱,但这不是我在这里关心的。)IEquatable<T>EqualsGetHashCode

  • 支持 的论点DistinctB:通用参数约束虽然不是绝对必要的,但使调用者可以看到该方法将比较 的实例T,因此是一个信号,Equals并且GetHashCode应该正确地工作于T。(毕竟,在没有显式实现的情况下定义新类型Equals并且GetHashCode很容易发生,因此约束可能有助于及早发现一些错误。)

问题:是否有既定并记录在案的最佳实践建议何时指定此特定约束 ( T : IEquatable<T>),何时不指定?如果没有,上述论点之一是否有任何缺陷?(在这种情况下,我更喜欢经过深思熟虑的论点,而不仅仅是个人意见。)

0 投票
2 回答
1956 浏览

c# - 使用哈希码比较对象的属性

我需要知道使用哈希码比较许多对象的方法。所以这是其中的一课。

但是有2个错误。两者都是一样的。

“string”不包含“SafeGetHashCode”的定义,并且找不到接受“string”类型的第一个参数的扩展方法“SafeGetHashCode”(您是否缺少 using 指令或程序集引用?)

而对于isSame(),我不知道怎么写代码。概念是比较所有对象,如果有 2 个相同的 ID 和名称,将它们组合在一起。

所以项目 A 和 C 将组合在一起。

0 投票
1 回答
113 浏览

c# - 对象比较(多级)

我想创建具有 5 个属性的对象,每个属性都有 2 个属性。之后,我比较对象是否相同,它们将被归为同一类别。

这是代码:

物品.cs

排序属性.cs

Program.cs(测试编码的主类)

结果应该返回,因为和(SortPropc)true之间有相同的属性,但它返回。objAobjBfalse

我相信我错过了一些逻辑部分,我已经坐在椅子上 4 个小时但无法修复它。任何人都可以解决它吗?

0 投票
2 回答
563 浏览

c# - POCO 身份字段上的 IEquatable

我有来自具有身份 ID 字段的 SQL Server 数据库的 POCO。我想实现 IEquatable 所以我可以检查它们是否是相同的记录,使用.Contains()List<T>

假设我永远不需要比较未保存的实例,仅使用以下方法就足够了:

我正要这样做,但只是想检查一下,因为我不是 100% 确定 GetHashCode 与它有什么关系,或者是否有任何其他考虑因素(例如“未保存的实例”,其中我可以丢弃)我不知道。

0 投票
1 回答
337 浏览

c# - 使用 IEquatable 测试对象集合是否相等

我有一个已经实现的类,IEquatable<T>以便在测试时可以IEnumerable使用以下调用轻松比较这些对象的集合:

这目前运作良好,但我有一些挥之不去的疑问。该类如下所示:

我对覆盖的理解GetHashCode()是它用于比较指向同一类实例的对象。在这种情况下(即使在将来)极不可能需要这样做。

这种理解是否正确,如果正确,我可以安全地删除代码吗?

在我的单元测试中是否有更好的方法来比较这些对象的集合?

虽然我被限制使用 MSTest。

0 投票
1 回答
2845 浏览

c# - LINQ Distinct with EqualityComparer.Default: IEquatable implementation ignored?

I have a class Foo with two fields where the Equals and GetHashCode methods have been overridden:

If I create an array of Foo:s and count the number of Distinct values of this array:

The number of distinct values is recognized as:

If I now make my class Foo implement IEquatable<Foo> using the following implementation:

The number of distinct values is still:

But if I change the implementation to this:

The computed number of distinct Foo:s is neither 3 (i.e. the number of distinct _x) nor 2 (number of distinct _y), but:

And if I comment out the Equals and GetHashCode overrides but keep the IEquatable<Foo> implementation, the answer is also 4.

According to MSDN documentation, this Distinct overload should use the static property EqualityComparer.Default to define the equality comparison, and:

But looking at the experiment above, this statement does not seem to hold. At best, the IEquatable<Foo> implementation supports the already provided Equals and GetHashCode overrides, and at worst it completely corrupts the equality comparison.

My questions:

  • Why does the independent implementation of IEquatable<T> corrupt the equality comparison?
  • Can it play a role independent of the Equals and GetHashCode overrides?
  • If not, why does EqualityComparer<T>.Default look for this implementation first?
0 投票
2 回答
2275 浏览

c# - 如何进入接口方法(等于)

我已经实现了 iEquatable 接口:

但现在我想Equals(...)通过单步调试代码来调试我的方法。但即使在调试模式下,单步执行也不会进入它(即 F11),并且在方法中放置断点也不会让我进入它。我该如何调试它?

并不是说它应该是相关的,但这是我的Equals方法:

编辑: 我现在从我的代码中的其他地方调用该方法,如下所示:

但这仍然不允许我调试它。

0 投票
1 回答
84 浏览

c# - 重写 Object.Equals 时,是否适合使用传入的对象的 Equals(MyType)?

举一个简单的例子,假设你有两个在很多方面都不同的类,但仍然可以被认为是“等价的”:

这将允许任何声称等同于 WholeNumber 的对象被传递到 WholeNumber 的 Equals(object) 函数中,并获得所需的结果,而无需 WholeNumber 了解任何其他类。

这种模式是个好主意吗?将 IEquatable 与其他类一起使用是一件常见的事情吗?