C# string.GetHashCode和IEqualityComparer之间的差异<;字符串>;。Default.GetHashCode
我想对我的数据使用C# string.GetHashCode和IEqualityComparer之间的差异<;字符串>;。Default.GetHashCode,c#,.net,C#,.net,我想对我的数据使用Distinct(),声明为IEnumerable。在这种情况下,我必须实现自己的IEqualityComparer,我的问题是: 以下实现之间有什么区别吗 public int GetHashCode(KeyValuePair<IdentType, string> obj) { return EqualityComparer<string>.Default.GetHashCode(obj.Value); } public int GetHas
Distinct()
,声明为IEnumerable
。在这种情况下,我必须实现自己的IEqualityComparer
,我的问题是:
以下实现之间有什么区别吗
public int GetHashCode(KeyValuePair<IdentType, string> obj) {
return EqualityComparer<string>.Default.GetHashCode(obj.Value);
}
public int GetHashCode(KeyValuePair obj){
返回EqualityComparer.Default.GetHashCode(obj.Value);
}
及
public int GetHashCode(KeyValuePair obj){
返回obj.Value.GetHashCode();
}
不,它没有。实现将是相同的,因为它们都对实际类调用GetHashCode()
,在本例中为string
最后,EqualityComparer
an中的方法及其实现是:
在这种情况下,
obj
将是原始的字符串
,您可以在其中调用GetHasCode
。唯一使其行为不同的情况是当字符串
为null
时只有一个:如果字符串为null,等式比较器的GetHashCode
将返回0,而第二个实现将抛出一个异常。一个区别是,当您将null
传递给它时,EqualityComparer.Default.GetHashCode
不会崩溃
using System;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
var n = EqualityComparer<string>.Default.GetHashCode(null);
Console.WriteLine(n);
}
}
使用系统;
使用System.Collections.Generic;
公开课考试
{
公共静态void Main()
{
var n=EqualityComparer.Default.GetHashCode(null);
控制台写入线(n);
}
}
除此之外,结果在设计上是相同的,因为System.String
实现了IEquatable
默认属性检查类型T是否实现了System.IEquatable
通用接口,如果是,则返回调用IEquatable.Equals
方法实现的EqualityComparer
。否则,它将返回一个由T
提供的EqualityComparer
你的两种方法只有一点不同 如果类执行
iequatable
(哪个字符串执行),则将返回类型为的类。因此,GetHashCode(obj.Value)
被调用到
public override int GetHashCode(T obj) {
if (obj == null) return 0;
return obj.GetHashCode();
}
这与调用obj.Value.GetHashCode()相同
directly,但如果有空字符串,则默认比较器将返回0,直接调用版本将抛出空引用异常
using System;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
var n = EqualityComparer<string>.Default.GetHashCode(null);
Console.WriteLine(n);
}
}
public override int GetHashCode(T obj) {
if (obj == null) return 0;
return obj.GetHashCode();
}