问题标签 [iequalitycomparer]
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.
c# - 通过自定义 IEqualityComparer 与 2 个 EntityCollections 相交
不要过多地重复这个问题,但我已经进行了搜索,结果却一无所获。所以我有两个 T 类型的 EntityCollections,我想在每个中找到共同的项目。捕获?除一个以外的所有字段都必须匹配。例如,如果 T 类型是 CustomSet 类型,并且 CustomSet 包括字段 F1、F2、F3 和 FK 字段 OtherId,则 F1、F2 和 F3 必须匹配(它们可以是字符串、整数,任何东西)并且 OtherId 永远不会匹配。我目前的实现:
将永远不会产生任何结果,因为 OtherId 列将永远不会在任何其他集合中匹配,即使字段 F1、F2 和 F3 可能匹配。所以我提出了一个 IEqualityComparer 的自定义实现,如下所示:
现在,我只是对此进行测试,因此传入的 obj 是 CustomSet 类型,如果我能让它正常运行,我将为我的其他类型添加必要的 if 语句。我知道 Intersect 扩展使用 GetHashCode 而不是 Equals 来比较项目,这就是为什么我真的不在乎我的 equals 中的内容,因为除了 EntityCollections 上的 Intersect 扩展之外,永远不会调用此类。问题是,这行不通。在我的测试集上,我知道我的“源”集合中有 28 个项目,“目标”集合中有 28 个项目,并且所有字段都匹配(显然,OtherId 字段除外)。我遍历了 GetHashCode 代码,因为它循环了 56 次,并且能够匹配每组中所有 28 个项目的哈希码,但“交叉点”的计数为 0。有什么我做错或遗漏的事情吗?谢谢。}
c# - 对象内的 IEqualityComparer 字符串值
我很可能这样做是错误的,但是;
我在 LINQ 中有一个对象列表;
现在我正在尝试查看该列表中是否有任何对象具有字符串值;
所以我有;
在我的比较器中;
如何使用比较器检查对象字段中的字符串值?
visual-studio - Visual Studio 中的单元测试:在我的类中实现什么才能使用 Assert.AreEqual?
我正在向我的(Visual Basic)项目中添加单元测试。我正在使用 Visual Studio (2010 Premium) 中的测试工具。在几个测试中,我想确保我的类等于 Assert.AreEqual 类的预期值。但这不是开箱即用的。
最好做什么,重写Equals Method实现IEqualityComparer接口,或者......?
c# - 没有 IEqualityComparer 实现的 LINQ
我有 2 个不同类别的集合。MyClass1 - 姓名、年龄等 MyClass2 - 尼克、年龄等
我想找到这个集合之外的东西。就像是
list1.Exept(list2, (l1,l2) => l1.Name==l2.Nick);
但是我不能编写这段代码,需要用 IEqualityComparer 接口实现我自己的比较器类,而且对于这个小任务来说,它看起来非常开销。有什么优雅的解决方案吗?
c# - 为什么选择 IEqualityComparer有 GetHashCode() 方法吗?
命名空间中的IEqualityComparerSystem.Collections.Generic
具有以下方法:
由于该接口用于检查对象的相等性,因此第一种方法Equals
是有意义的。但是为什么我们GetHashCode
还需要实施呢?为什么它首先存在于界面中?什么时候需要它,为什么?
我在 namespace 中将它与Enumerable.Distinct()System.Linq
方法一起使用,我很惊讶地看到 evenGetHashCode()
与Equals()
. 为什么?如何Distinct
工作?
c# - 比较两个字典的最佳方法为了平等
这是为两个字典的相等性创建比较器的最佳方法吗?这需要准确。请注意, Entity.Columns 是 KeyValuePair(string, object) 的字典:
也不太确定 GetHashCode 的实现。
谢谢!
c# - 自定义对象使用除了未能使用 IEqualityComparer
这是目标代码:
我有两个列表如下:
delItems 始终包含两个项目。我在这里想念什么?
编辑:代码现在实现 IEquatable
.net - Enumerable.SequenceEqual和平等比较器
来自 MSDN
SequenceEqual(IEnumerable, IEnumerable) 方法并行枚举两个源序列,并使用 TSource、Default 的默认相等比较器比较对应的元素。默认相等比较器 Default 用于比较实现 IEqualityComparer 泛型接口的类型的值。
a)据我了解上面的引用,它暗示EqualityComparer<T>.Default
用于比较实现 的类型的元素,IEqualityComparer<T>
而实际上 Default
用于返回IEqualityComparer<T>
调用IEquatable<T>.Equals
(假设T
可分配给IEquatable<T>
)或它调用的特定实现Object.Equals
b) 引用还表明TSource
must implement IEqualityComparer<T>
,这是不正确的:
那么我是否误解了报价试图传达的内容,或者报价完全错误?
谢谢你
c# - 平等比较器.Default 不够聪明
我正在阅读的源代码,EqualityComparer<T>.Default
发现它不是那么聪明。这是一个例子:
原因从 EqualityComparer 中的私有方法的源码中就很明显了。
我们可以看到EqualityComparer<int>.Default
,EqualityComparer<MyEnum>.Default
并EqualityComparer<long>.Default
得到一个明智的比较器,其Equals
方法如下:
上面两个很聪明,但是EqualityComparer<AnotherEnum>.Default
很不幸,从方法中我们最后可以看到它得到一个ObjectEqualityComparer<T>()
,它的Equals
方法大概是这样的:
我认为这个条件Enum.GetUnderlyingType(c) == typeof(int)
是没有意义的,如果一个枚举的底层类型是 int 类型,该方法可以将int 的默认比较器转换为这个枚举。但是为什么不能基于 long 的枚举呢?我想这不是那么难吗?有什么特殊原因吗?构建一个比较器x == y
对于枚举来说并不难,对吧?为什么最后它会降低ObjectEqualityComparer<T>
枚举速度(即使它工作正常)?
c# - 平等比较器.Default vs. T.Equals
假设我有一个MyClass<T>
需要比较两个 type 对象的泛型<T>
。通常我会做类似...
现在假设我MyClass<T>
有一个支持传递自定义的构造函数IEqualityComparer<T>
,类似于Dictionary<T>
. 在那种情况下,我需要做...
要删除这个冗长的 if 语句,如果使用常规构造函数,我可以_comparer
默认为“默认比较器”,这将是一件好事。我搜索了类似的东西,typeof(T).GetDefaultComparer()
但找不到类似的东西。
我确实找到了EqualityComparer<T>.Default
,我可以使用它吗?然后这个片段......
o1.Equals(o2)
...提供与所有可能情况相同的结果?
(作为旁注,这是否意味着我还需要使用任何特殊的通用约束<T>
?)