我想将Distinct()
与我的数据一起使用,声明为IEnumerable<KeyValuePair<IdentType, string>>
。在这种情况下,我必须实现自己的IEqualityComparer
,我的问题是:
以下实施之间有什么区别吗?
public int GetHashCode(KeyValuePair<IdentType, string> obj) {
return EqualityComparer<string>.Default.GetHashCode(obj.Value);
}
和
public int GetHashCode(KeyValuePair<IdentType, string> obj) {
return obj.Value.GetHashCode();
}
答案 0 :(得分:4)
两种方法之间只有很小的差异。
如果类隐含IEquateable<T>
(字符串确实存在), EqualityComparer<string>.Default
将返回类型GenericEqualityComparer<T>
的类。因此GetHashCode(obj.Value)
被调用
public override int GetHashCode(T obj) {
if (obj == null) return 0;
return obj.GetHashCode();
}
与直接调用obj.Value.GetHashCode();
相同,除了如果你有一个空字符串,默认比较器将返回0并且直接调用版本将抛出空引用异常。
答案 1 :(得分:2)
只有一个:如果字符串为null,则相等比较器&#39; s GetHashCode
将返回0,而第二个实现将引发异常。
答案 2 :(得分:2)
一个区别是,当EqualityComparer<string>.Default.GetHashCode
传递给null
时,using System;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
var n = EqualityComparer<string>.Default.GetHashCode(null);
Console.WriteLine(n);
}
}
不会崩溃。
System.String
除此之外,结果在设计上是相同的,因为IEquatable<System.String>
实现System.IEquatable<T>
Default属性检查类型T是否实现
EqualityComparer<T>
泛型接口,如果是,则返回调用IEquatable<T>.Equals
方法实现的EqualityComparer<T>
。否则,它会返回T
,由{{1}}提供。
答案 3 :(得分:1)
没有。它没有。实现将是相同的,因为他们都在实际的类上调用GetHashCode()
,在这种情况下string
。
最后,EqualityComparer
CreateComparer
和creates内的GenericEqualityComparer
方法以及GetHashCode
的实施方式为:
public override int GetHashCode(T obj) {
if (obj == null) return 0;
return obj.GetHashCode();
}
在这种情况下,obj
将是原始string
,否则您将在其中调用GetHasCode
。只有当string
为null