Csharp/C#教程:在C#中使用IEqualityComparer 接口和EqualityComparer 类分享


在C#中使用IEqualityComparer 接口和EqualityComparer 类

我正在编写一个循环链表,使用这篇文章作为帮助。

在一个函数中,在此列表中搜索具有给定值的节点

public Node Find(T item) { Node node = FindNode(head, item); return node; } Node FindNode(Node node, T valueToCompare) { Node result = null; if (comparer.Equals(node.Value, valueToCompare)) result = node; else if (result == null && node.Next != head) result = FindNode(node.Next, valueToCompare); return result; } 

作者使用IEqualityComparer comparer对象,该对象在其中一个构造函数中使用属性EqualityComparer.Default进行初始化。 你能解释一下在这里使用这些接口( IEqualityComparer )和类( EqualityComparer )的想法吗? 我读过MSDN,但我不理解工作和使用它们的原理。

IEqualityComparer是一个接口,用于处理集合的相等比较。 您的collections会将等同性比较委托给此界面。 您可能会问,为什么不调用Equals方法?

因为可以有几种可能的比较。 让我们举一个简单的例子: "Abc""ABC"相等? 这取决于。 "Abc".Equals("ABC") == false但是如果你想要不区分大小写怎么办?

这就是为什么您的集合应该相等比较委托给不同的类。 通过编写类,您将尊重单一责任原则:您的集合知道如何存储项目,并且相等比较器知道它们是否相等。

集合的示例:

 var caseSensitive = new HashSet(StringComparer.Ordinal) // The default anyway { "Abc", "ABC" }; var caseInsensitive = new HashSet(StringComparer.OrdinalIgnoreCase) { "Abc", "ABC" }; 

结果将是:

 caseSensitive.Count == 2 caseInsensitive.Count == 1 caseSensitive.Contains("aBc") == false caseInsensitive.Contains("aBc") == true 

在这里,您使用相同的HashSet类有两个完全不同的set语义。

现在, IEqualityComparer什么?

注意,这并不意味着如果GetHashCode(x) == GetHashCode(y)Equals(x, y) 。 两个对象可以具有相同的哈希码但是不相等(毕竟最多可以有0xFFFFFFFF哈希码)。

集合通常使用哈希代码来组织其项目。 例如, HashSet将知道如果两个对象不具有相同的哈希码,则它们将不相等,因此可以相应地组织其桶。 哈希码只是一种优化。

现在,什么是EqualityComparer.Default ? 它是IEqualityComparer一个IEqualityComparer快捷方式,它将使用对象自己的EqualsGetHashCode函数。 这是一个很好的默认值,因为这是你想要在大多数时间做的事情:虽然字符串可以有多个自然比较类型,但例如整数不是这种情况。

EqualityComparer.Default将处理几个特殊情况:

上述就是C#学习教程:在C#中使用IEqualityComparer 接口和EqualityComparer 类分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1303123.html

(0)
上一篇 2023年2月5日
下一篇 2023年2月5日

精彩推荐