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

.net - 确定 IEnumerable 中是否有任何元素可以转换为 U 类型

在较新版本的 .net 中,有许多扩展方法可以接受IEnumerable<T>IEnumerable. 一种这样的方法是OfType<TResult>返回一个仅包含原始序列的元素的可枚举,这些元素可以转换为指定的类型TIEnumerable无论原始列表的类型和目标类型如何,此方法都使用非泛型处理原始列表的所有项目,非常愉快地完成了任务。如果原始列表是一个IEnumerable<int>并且TResultint,它将获取原始列表的每个项目作为非泛型object,然后将其转换,即使它可以只使用原始列表IEnumerator<int>。如果原始列表是一个IEnumerable<int>并且TResultStringBuilder,它同样会通过装箱原始列表中的所有项目,即使它们都不可能被转换为目标类型。

编写一个采用 anIEnumerable<TSrc>并将其转换为 an的方法有多难IEnumerable<TResult>,有效地处理原始枚举中的所有项目都保证出现在后者中的情况,或者源枚举数的类型将暗示后者将为空(假设IEnumerable类型支持的所有变体都将返回相同的项目序列)?可以肯定的是,人们不会经常尝试将一个序列强制转换为它已经拥有的类型,但是拥有一个具有多个类型参数的泛型类并不少见,这些类型参数有时会重叠,有时不会重叠。

0 投票
3 回答
295 浏览

c# - 我必须实现哪些接口才能创建列表或字典连接两个值作为键

我需要使我的自定义对象在字典、列表等中正常工作......这样我就可以更改对象的属性,并允许它被使用,而不是孤立。

上次我尝试覆盖 GetHashCode() 时,当我将对象添加到字典时,我孤立了对象,对对象进行了更改(更改了 GetHashCode),这以某种方式导致字典无法正确地从内存中处理对象。

问题

有人可以解释一下:

  • 我需要在 TrustedEntityReference 中覆盖哪些接口和接口才能连接intTrustedEntity在排序字典中正常工作?

  • 对于 .NET 字典对象中使用的内容,哪些值决不能更改,否则会冒着孤立对象的风险?(例如,更改对象发出的哈希码可能会导致字典出现 GC 问题)

这是我正在处理的当前示例对象。

0 投票
2 回答
3321 浏览

c# - 覆盖 GetHashCode() 时使用 Guid().GetHashCode() 的缺点是什么

我找到了一个看起来像这样的 GetHashCode() 实现

即使认为 Equals 看起来是正确的,说这个实现会导致许多关于 .NET 的假设被打破是否正确?

我听到的反驳论点是,一旦创建对象,GetHashCode 就永远不需要改变。这是因为该对象存储在字典中。

有人可以为我澄清一下,并解释如果对象发生变化,GetHashCode 需要发生什么,最终会改变 Equals 方法吗?

0 投票
2 回答
830 浏览

c# - GetHashCode() 返回值应该基于原始对象的状态还是修改后的对象的状态?

我最近用几种不同的方式问过这个问题,但没有得到一个答案来告诉我<T,U>当我持有对发生变化的事物的引用时需要如何处理字典T.GetHashCode()。对于这个问题,“状态”是指在检查时也会检查的属性和字段Equals()。假设所有公共、内部和受保护的成员都包括在内。

鉴于我有一个 C# 对象

  • 覆盖 GetHashCode 和 Equals

  • 该对象作为Key值保存到Dictionary中(注意我的理解是Dictionary此时会读取GetHashCode值)

  • 我通过 Key 搜索对象并修改一个值。(修改此值会修改我的自定义 equals 函数和可能的 gethashcode)

我的问题是,GetHashCode 应该反映什么?这个函数的返回应该反映对象的原始状态还是修改后的状态?

示例代码

基于Jon Skeet 的这个回答(对我之前的问题)

“如果我更改了最终会更改键值的属性,我该怎么办?” - 我

.

“基本上你已经被塞满了。你不会(或至少可能不会)再次在字典中找到那个键。你应该尽可能小心地避免这种情况。就我个人而言,我通常会发现那些是字典键的良好候选者,也是不变性的良好候选者。” - JS

这是否意味着我需要从 Dictionary 中删除该对象并重新添加它?这是正确/最好的方法吗?

0 投票
1 回答
461 浏览

.net - IEquatable(Of T)/IEqualityComparer(Of T) 未被调用

我有一些带有两个对象列表的代码。第一个列表比第二个列表更具包容性。我希望从第一个列表中排除第二个列表中的项目。经过一些研究,我发现扩展方法Except是做到这一点的方法。因此IEquatable(Of T)IEqualityComparer(Of T)我在我的代码中实现了这样的东西:

然后我像这样打一个简单的电话:

这行不通。这也不是:

但是,这确实有效:

既然RecentCustomersLocalCustomers都是List(Of CustomerData)为什么默认的比较方法不起作用?当我说它不起作用时,我的意思是我可以在EqualsandGetHashCode例程中放置断点,它们永远不会被击中,并且返回的列表与LocalCustomers.

0 投票
5 回答
19118 浏览

c# - 如何覆盖列表包含

我想使用 List[MyObject] 比较一个属性而不是整个对象。因此,我使用 IEquatable[MyObject] 但编译器仍然需要 MyObject 而不是字符串属性。为什么?

这是我得到的:

0 投票
3 回答
2222 浏览

c# - 如果我正在实现 IEquatable 是否需要覆盖 Equals?

我知道在实现自定义相等检查时覆盖的重要性GetHashCode——我已经实现了接口,以及这里讨论IEquality<T>的泛型和非泛型之间的区别。现在有需要覆盖的地方吗?一切都不是通用的吗?Equals Equals(object t)Equals(T t)

0 投票
2 回答
1936 浏览

c# - 比较两个自定义类对象时遇到问题

可能重复:
比较引用类型的两个实例的“最佳实践”是什么?

我的应用程序有这个自定义类。这个类有两个实例(A 和 B),我试图比较它们。但是,我遇到了问题;我正在 IEquatable<T>使用重写的Equals方法实现接口以进行此比较。

这些Equals方法调用了ReferenceEquals行为不端的函数。

以下是测试用例:

案例1: A和B是不同的实例,包含不同的数据..ReferenceEquals说:它们是不同的(这是正确的!)

案例 2: A 和 B 是不同的实例,但 B 是使用 A 的变量值实例化的(即 A 和 B 都包含完全相同的数据!)..ReferenceEquals说:它们不同(这是错误的!)

案例 3: A 和 B 是相同的实例(即 A 被传入两次,例如Equals (A, A)ReferenceEquals说:它们是相同的(这是正确的!)

那么如何让案例 2 的结果也正确呢?

实现的类IEquatable<T>

调用该Equals方法的代码(此处为案例 2 配置):

那么这段代码有什么问题呢?

0 投票
1 回答
1418 浏览

c# - GetHashCode 已实现,但 Dictionary 无法找到密钥?

在我的课堂上,我已经实现了EqualsGetHashCode. 然而,当我在我的 C# 代码中将它用作字典的键时,我得到了错误:"Key not found exception" 谢谢,

我使用它的代码:

...

0 投票
2 回答
226 浏览

vb.net - IEquatable(Of T).Equals 的建议命名约定?

如果我IEquatable(Of T)在我的类上实现并让 Visual Studio (2010) 自动生成所需的Equals方法,我会得到:

1由于与 Object.Equals 的命名冲突,请注意额外的必要性。是否有任何约定/建议可以将此函数命名为除 之外的其他名称Equals1?因为坦率地说,这很丑陋。