GetHashCode()
将返回一个int
,而不是一个Decimal
。
Math.Abs(int)
int
只有当传递等于时才会失败int.MinValue
,所以你可以明确地测试那个条件:
int myValue = sdmpobject.SnapshotHandle.GetHashCode();
int absValue = myValue == int.MinValue ? int.MaxValue : Math.Abs(myValue);
int bucket = absValue % numPartitions;
这假设您可以接受因这种罕见的情况而离开一个人。由于您的结果位于一个名为“bucket”的变量中,因此您可能希望像这样逐个更正该变量:
int myValue = sdmpobject.SnapshotHandle.GetHashCode();
int bucket;
if (myValue == int.MinValue)
{
bucket = ((int.MaxValue % numPartitions) + 1) % numPartitions;
}
else
{
int bucket = Math.Abs(myValue) % numPartitions;
}
您不能只为所有值“翻转符号”的原因是,带符号的数据类型通常可以比正数多容纳一个负数,因此它们不能代表它们可以容纳的最大负数的绝对值。