gpt4 book ai didi

c# - GetHashCode 当其中一个属性可以为 null 时

转载 作者:行者123 更新时间:2023-12-05 04:22:39 25 4
gpt4 key购买 nike

我目前正在想办法处理这种情况,我想在字典中使用某个对象作为键,因此我需要它覆盖 GetHashCodeEquals 方法。问题是我的对象的其中一个属性可以为空。

public class Car
{
public int Id { get; set; }
public CarBodyType Type { get; set; }

public int? LifeSpanInYears { get; set; }


public override bool Equals(object o)
{
// ...
}

public override int GetHashCode()
{
var result = base.GetHashCode();
result = (result * 397) ^ this.Id.GetHashCode();
result = (result * 397) ^ this.Type.GetHashCode();

// Here ... What is the best approach? Currently, result will be 1 if LifeSpanInYears is null.
result = (result * 397) ^ (this.LifeSpanInYears?.GetHashCode() ?? 0);

return result;
}
}

处理其中一个属性的可能空值时最好的方法是什么?我认为这是最好的方法。

if (this.LifeSpanInYears.HasValue)
{
result = (result * 397) ^ this.LifeSpanInYears.GetHashCode();
}

至少我会解决这个问题,每当任何可为 null 的属性为 null 时,GetHashCode 的结果都是 1。

您对此有何看法?

非常感谢您的回复。

最佳答案

您可以考虑使用内置的 HashCode结构:

public override int GetHashCode()
{
HashCode hashCode = new();
hashCode.Add(this.Id);
hashCode.Add(this.Type);
hashCode.Add(this.LifeSpanInYears);
return hashCode.ToHashCode();
}

...或者:

public override int GetHashCode()
{
return HashCode.Combine(this.Id, this.Type, this.LifeSpanInYears);
}

它负责处理可为空的值。您无需为他们做任何特别的事情。

我预计它会比您的乘法+XOR 方法慢,但它应该会产生质量更好的哈希码。 HashCode 结构的源代码是 here .

注意HashCode 类型在 .NET Core 2.1 及更高版本中可用。

关于c# - GetHashCode 当其中一个属性可以为 null 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73925136/

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