string.GetHashCode和IEqualityComparer之间的区别<string> .Default.GetHashCode </string>

时间:2014-10-28 13:32:44

标签: c# .net

我想将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();
}

4 个答案:

答案 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 CreateComparercreates内的GenericEqualityComparer方法以及GetHashCode的实施方式为:

public override int GetHashCode(T obj) {
    if (obj == null) return 0;
    return obj.GetHashCode();
}

在这种情况下,obj将是原始string,否则您将在其中调用GetHasCode。只有当stringnull

时才会使其表现不同的唯一情况