C#中IEqualityComparer接口和EqualityComparer类的使用我在写一个循环链表,借用这篇文章作为帮助。在一个函数中,在这个列表中搜索具有给定值的节点publicNodeFind(Titem){Nodenode=FindNode(head,item);返回节点;}NodeFindNode(Nodenode,TvalueToCompare){Noderesult=null;如果(比较器。等于(节点。值,valueToCompare))结果=节点;elseif(result==null&&node.Next!=head)result=FindNode(node.Next,valueToCompare);返回结果;}作者使用IEqualityComparer比较器对象,该对象在具有EqualityComparer.Default属性的构造函数之一中进行初始化。你能在这里解释一下使用这些接口(IEqualityComparer)和类(EqualityComparer)的想法吗?我读过MSDN,但我不明白工作和使用它们的基本原理。IEqualityComparer是一个用于处理集合相等比较的接口。您的集合会将相等性比较委托给此接口。你可能会问,为什么不调用Equals方法呢?因为可以有几种可能的比较。举个简单的例子:“Abc”和“ABC”相等?这取决于。"Abc".Equals("ABC")==false但是如果你想要不区分大小写怎么办?这就是为什么您的集合应该将相等性比较委托给不同的类。通过编写你的类,你尊重单一职责原则:你的集合知道如何存储项目,你的相等比较器知道它们是否相等。集合示例:varcaseSensitive=newHashSet(StringComparer.Ordinal)//默认值{"Abc","ABC"};varcaseInsensitive=newHashSet(StringComparer.OrdinalIgnoreCase){"Abc","ABC"};结果将是:caseSensitive.Count==2caseInsensitive.Count==1caseSensitive.Contains("aBc")==falsecaseInsensitive.Contains("aBc")==true这里你使用相同的HashSet类来得到两个完全不同的设置语义。现在,IEqualityComparer怎么样?请注意,这并不意味着如果GetHashCode(x)==GetHashCode(y)thenEquals(x,y)。两个对象可以具有相同的哈希码但不相等(毕竟最多可以有0xFFFFFFFF哈希码)。集合通常使用哈希码来组织他们的项目。例如,如果两个对象的哈希码不同,HashSet就会知道它们不相等,并且可以相应地组织它的桶。哈希码只是一种优化。现在,什么是EqualityComparer.Default?它是IEqualityComparer的快捷方式,它将使用对象自己的Equals和GetHashCode函数。这是一个很好的默认值,因为这是你大多数时候想要做的:虽然字符串可以有多种自然比较类型,但情况并非如此,例如整数。EqualityComparer.Default会处理几种特殊情况:以上是C#学习教程:使用IEqualityComparer接口和C#中的EqualityComparer类,分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
