问题标签 [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.

0 投票
1 回答
940 浏览

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。有什么我做错或遗漏的事情吗?谢谢。}

0 投票
3 回答
4765 浏览

c# - 对象内的 IEqualityComparer 字符串值

我很可能这样做是错误的,但是;

我在 LINQ 中有一个对象列表;

现在我正在尝试查看该列表中是否有任何对象具有字符串值;

所以我有;

在我的比较器中;

如何使用比较器检查对象字段中的字符串值?

0 投票
1 回答
182 浏览

visual-studio - Visual Studio 中的单元测试:在我的类中实现什么才能使用 Assert.AreEqual?

我正在向我的(Visual Basic)项目中添加单元测试。我正在使用 Visual Studio (2010 Premium) 中的测试工具。在几个测试中,我想确保我的类等于 Assert.AreEqual 类的预期值。但这不是开箱即用的。

最好做什么,重写Equals Method实现IEqualityComparer接口,或者......?

0 投票
2 回答
534 浏览

c# - 没有 IEqualityComparer 实现的 LINQ

我有 2 个不同类别的集合。MyClass1 - 姓名、年龄等 MyClass2 - 尼克、年龄等

我想找到这个集合之外的东西。就像是

list1.Exept(list2, (l1,l2) => l1.Name==l2.Nick);

但是我不能编写这段代码,需要用 IEqualityComparer 接口实现我自己的比较器类,而且对于这个小任务来说,它看起来非常开销。有什么优雅的解决方案吗?

0 投票
4 回答
2069 浏览

c# - 为什么选择 IEqualityComparer有 GetHashCode() 方法吗?

命名空间中的IEqualityComparerSystem.Collections.Generic具有以下方法:

由于该接口用于检查对象的相等性,因此第一种方法Equals是有意义的。但是为什么我们GetHashCode还需要实施呢?为什么它首先存在于界面中?什么时候需要它,为什么?

我在 namespace 中将它与Enumerable.Distinct()System.Linq方法一起使用,我很惊讶地看到 evenGetHashCode()Equals(). 为什么?如何Distinct工作?

0 投票
3 回答
9238 浏览

c# - 比较两个字典的最佳方法为了平等

这是为两个字典的相等性创建比较器的最佳方法吗?这需要准确。请注意, Entity.Columns 是 KeyValuePair(string, object) 的字典:

也不太确定 GetHashCode 的实现。

谢谢!

0 投票
1 回答
1481 浏览

c# - 自定义对象使用除了未能使用 IEqualityComparer

这是目标代码:

我有两个列表如下:

delItems 始终包含两个项目。我在这里想念什么?

编辑:代码现在实现 IEquatable

0 投票
2 回答
603 浏览

.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) 引用还表明TSourcemust implement IEqualityComparer<T>,这是不正确的:

那么我是否误解了报价试图传达的内容,或者报价完全错误?

谢谢你

0 投票
1 回答
3695 浏览

c# - 平等比较器.Default 不够聪明

我正在阅读的源代码,EqualityComparer<T>.Default发现它不是那么聪明。这是一个例子:

原因从 EqualityComparer 中的私有方法的源码中就很明显了。

我们可以看到EqualityComparer<int>.DefaultEqualityComparer<MyEnum>.DefaultEqualityComparer<long>.Default得到一个明智的比较器,其Equals方法如下:

上面两个很聪明,但是EqualityComparer<AnotherEnum>.Default很不幸,从方法中我们最后可以看到它得到一个ObjectEqualityComparer<T>(),它的Equals方法大概是这样的:

我认为这个条件Enum.GetUnderlyingType(c) == typeof(int)是没有意义的,如果一个枚举的底层类型是 int 类型,该方法可以int 的默认比较器转换为这个枚举。但是为什么不能基于 long 的枚举呢?我想这不是那么难吗?有什么特殊原因吗?构建一个比较器x == y对于枚举来说并不难,对吧?为什么最后它会降低ObjectEqualityComparer<T>枚举速度(即使它工作正常)?

0 投票
5 回答
19809 浏览

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>?)