问题标签 [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.
.net - 确定 IEnumerable 中是否有任何元素可以转换为 U 类型
在较新版本的 .net 中,有许多扩展方法可以接受IEnumerable<T>
或IEnumerable
. 一种这样的方法是OfType<TResult>
返回一个仅包含原始序列的元素的可枚举,这些元素可以转换为指定的类型T
。IEnumerable
无论原始列表的类型和目标类型如何,此方法都使用非泛型处理原始列表的所有项目,非常愉快地完成了任务。如果原始列表是一个IEnumerable<int>
并且TResult
是int
,它将获取原始列表的每个项目作为非泛型object
,然后将其转换,即使它可以只使用原始列表IEnumerator<int>
。如果原始列表是一个IEnumerable<int>
并且TResult
是StringBuilder
,它同样会通过装箱原始列表中的所有项目,即使它们都不可能被转换为目标类型。
编写一个采用 anIEnumerable<TSrc>
并将其转换为 an的方法有多难IEnumerable<TResult>
,有效地处理原始枚举中的所有项目都保证出现在后者中的情况,或者源枚举数的类型将暗示后者将为空(假设IEnumerable
类型支持的所有变体都将返回相同的项目序列)?可以肯定的是,人们不会经常尝试将一个序列强制转换为它已经拥有的类型,但是拥有一个具有多个类型参数的泛型类并不少见,这些类型参数有时会重叠,有时不会重叠。
c# - 我必须实现哪些接口才能创建列表或字典连接两个值作为键
我需要使我的自定义对象在字典、列表等中正常工作......这样我就可以更改对象的属性,并允许它被使用,而不是孤立。
上次我尝试覆盖 GetHashCode() 时,当我将对象添加到字典时,我孤立了对象,对对象进行了更改(更改了 GetHashCode),这以某种方式导致字典无法正确地从内存中处理对象。
问题
有人可以解释一下:
我需要在 TrustedEntityReference 中覆盖哪些接口和接口才能连接
int
并TrustedEntity
在排序字典中正常工作?对于 .NET 字典对象中使用的内容,哪些值决不能更改,否则会冒着孤立对象的风险?(例如,更改对象发出的哈希码可能会导致字典出现 GC 问题)
这是我正在处理的当前示例对象。
c# - 覆盖 GetHashCode() 时使用 Guid().GetHashCode() 的缺点是什么
我找到了一个看起来像这样的 GetHashCode() 实现
即使认为 Equals 看起来是正确的,说这个实现会导致许多关于 .NET 的假设被打破是否正确?
我听到的反驳论点是,一旦创建对象,GetHashCode 就永远不需要改变。这是因为该对象存储在字典中。
有人可以为我澄清一下,并解释如果对象发生变化,GetHashCode 需要发生什么,最终会改变 Equals 方法吗?
c# - GetHashCode() 返回值应该基于原始对象的状态还是修改后的对象的状态?
我最近用几种不同的方式问过这个问题,但没有得到一个答案来告诉我<T,U>
当我持有对发生变化的事物的引用时需要如何处理字典T.GetHashCode()
。对于这个问题,“状态”是指在检查时也会检查的属性和字段Equals()
。假设所有公共、内部和受保护的成员都包括在内。
鉴于我有一个 C# 对象
覆盖 GetHashCode 和 Equals
该对象作为Key值保存到Dictionary中(注意我的理解是Dictionary此时会读取GetHashCode值)
我通过 Key 搜索对象并修改一个值。(修改此值会修改我的自定义 equals 函数和可能的 gethashcode)
我的问题是,GetHashCode 应该反映什么?这个函数的返回应该反映对象的原始状态还是修改后的状态?
示例代码
基于Jon Skeet 的这个回答(对我之前的问题)
“如果我更改了最终会更改键值的属性,我该怎么办?” - 我
.
“基本上你已经被塞满了。你不会(或至少可能不会)再次在字典中找到那个键。你应该尽可能小心地避免这种情况。就我个人而言,我通常会发现那些是字典键的良好候选者,也是不变性的良好候选者。” - JS
这是否意味着我需要从 Dictionary 中删除该对象并重新添加它?这是正确/最好的方法吗?
.net - IEquatable(Of T)/IEqualityComparer(Of T) 未被调用
我有一些带有两个对象列表的代码。第一个列表比第二个列表更具包容性。我希望从第一个列表中排除第二个列表中的项目。经过一些研究,我发现扩展方法Except
是做到这一点的方法。因此IEquatable(Of T)
,IEqualityComparer(Of T)
我在我的代码中实现了这样的东西:
然后我像这样打一个简单的电话:
这行不通。这也不是:
但是,这确实有效:
既然RecentCustomers
和LocalCustomers
都是List(Of CustomerData)
为什么默认的比较方法不起作用?当我说它不起作用时,我的意思是我可以在Equals
andGetHashCode
例程中放置断点,它们永远不会被击中,并且返回的列表与LocalCustomers
.
c# - 如何覆盖列表包含
我想使用 List[MyObject] 比较一个属性而不是整个对象。因此,我使用 IEquatable[MyObject] 但编译器仍然需要 MyObject 而不是字符串属性。为什么?
这是我得到的:
c# - 如果我正在实现 IEquatable 是否需要覆盖 Equals?
我知道在实现自定义相等检查时覆盖的重要性GetHashCode
——我已经实现了接口,以及这里讨论IEquality<T>
的泛型和非泛型之间的区别。现在有需要覆盖的地方吗?一切都不是通用的吗?Equals
Equals(object t)
Equals(T t)
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 配置):
那么这段代码有什么问题呢?
c# - GetHashCode 已实现,但 Dictionary 无法找到密钥?
在我的课堂上,我已经实现了Equals
和GetHashCode
. 然而,当我在我的 C# 代码中将它用作字典的键时,我得到了错误:"Key not found exception"
谢谢,
我使用它的代码:
...
vb.net - IEquatable(Of T).Equals 的建议命名约定?
如果我IEquatable(Of T)
在我的类上实现并让 Visual Studio (2010) 自动生成所需的Equals
方法,我会得到:
1
由于与 Object.Equals 的命名冲突,请注意额外的必要性。是否有任何约定/建议可以将此函数命名为除 之外的其他名称Equals1
?因为坦率地说,这很丑陋。