gpt4 book ai didi

c# - GetHashCode() 用于依赖 OrdinalIgnoreCase 的字符串类

转载 作者:可可西里 更新时间:2023-11-01 03:13:33 25 4
gpt4 key购买 nike

public class Address{
public string ContactName {get; private set;}
public string Company {get; private set;}
//...
public string Zip {get; private set;}
}

我想实现不同地址的概念,所以我覆盖了 Equals() 以测试所有字段中不区分大小写的相等性(因为这些是美国地址,我使用 Ordinal 而不是 InvariantCulture 以获得最佳性能) :

public override bool Equals(Object obj){
if (obj == null || this.GetType() != obj.GetType())
return false;

Address o = (Address)obj;

return
(string.Compare(this.ContactName, o.ContactName, StringComparison.OrdinalIgnoreCase) == 0) &&
(string.Compare(this.Company, o.Company, StringComparison.OrdinalIgnoreCase) == 0)
// ...
(string.Compare(this.Zip, o.Zip, StringComparison.OrdinalIgnoreCase) == 0)
}

我想像这样写一个 GetHashCode()(暂时忽略 concatenation inefficiency):

public override int GetHashCode(){
return (this.contactName + this.address1 + this.zip).ToLowerOrdinal().GetHashCode();
}

但这不存在。我应该用什么代替?或者我应该只在我的 Equals() 方法中使用 InvariantCulture 吗?

(我在想 .ToLowerInvariant().GetHashCode(),但我不能 100% 确定 InvariantCulture 不能确定相同的字符(例如重音符号)具有在另一个上下文中有不同的含义。)

最佳答案

无论您在 Equals() 中使用哪种字符串比较方法,在 GetHashCode() 中使用相同的方法都是有意义的。

无需为了计算哈希码而创建临时字符串。对于 StringComparison.OrdinalIgnoreCase,使用 StringComparer.OrdinalIgnoreCase.GetHashCode()

然后需要将多个哈希码合二为一。 XOR 应该没问题(因为一个人的邮政编码不太可能是另一个人的联系人姓名)。然而purists可能不同意。

public override int GetHashCode()
{
return StringComparer.OrdinalIgnoreCase.GetHashCode(ContactName) ^
StringComparer.OrdinalIgnoreCase.GetHashCode(Company) ^
// ...
StringComparer.OrdinalIgnoreCase.GetHashCode(Zip);
}

说了这么多,我怀疑使用像 Address 这样的复合结构作为字典的键是否明智。但该原则适用于身份类型字符串。

关于c# - GetHashCode() 用于依赖 OrdinalIgnoreCase 的字符串类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11475737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com