在.NET GetHashCode方法中,很多地方都使用.NET 方法.特别是在快速查找集合中的项目或确定相等性时.是否有关于如何GetHashCode为我的自定义类实现覆盖的标准算法/最佳实践,因此我不会降低性能?
我有一个简单的课程:
public class TileName {
int Zoom, X, Y;
public override bool Equals (object obj)
{
var o = obj as TileName;
return (o != null) && (o.Zoom == Zoom) && (o.X == X) && (o.Y == Y);
}
public override int GetHashCode ()
{
return (Zoom + X + Y).GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
我很好奇,如果我做了类似的事情,我会得到更好的哈希码分布:
public override int GetHashCode ()
{
return Zoom.GetHashCode() + X.GetHashCode() + Y.GetHashCode();
}
Run Code Online (Sandbox Code Playgroud)
这个类将被用作Dictionary键,所以我确实希望确保有一个不错的发行版.
嘿,我正在使用Enumerable.Sum()LINQ 的扩展方法来计算哈希码,并且OverflowExceptions在代码变大时遇到问题.我尝试将电话放在一个unchecked区块中,但这似乎没有帮助.
该方法的MSDN文档说,如果值太大,它将抛出,但我检查了反射器,这就是:
public static int Sum(this IEnumerable<int> source) {
if (source == null) {
throw Error.ArgumentNull("source");
}
int num = 0;
foreach (int num2 in source) {
num += num2;
}
return num;
}
Run Code Online (Sandbox Code Playgroud)
根据这个反编译,我希望它可以溢出或不取决于调用代码的上下文.为什么它会溢出,我怎么能让它停止?
我只是想从我正在执行的特定自定义对象列表中添加值,如下所示:
private int CountChances()
{
int totalChance = 0;
foreach(var chance in this.Chances)
{
totalChance += chance.Value;
}
return totalChance;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有foreach循环的情况下更快地完成这项工作?我几乎可以肯定linq应该能够快速完成这项工作,但我似乎无法找到如何做到这一点.