上面的for循环解决方案中存在一个问题,对于下面这个所有值都为正数的输入数组,求和结果为负数:
int[] arr = new int[] { Int32.MaxValue, 1 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Console.WriteLine(sum);
由于正结果太大,超出了int数据类型的范围并溢出为负值,因此总和为-2147483648。
对于相同的输入数组,arr.Sum()建议会引发溢出异常。
更健壮的解决方案是使用更大的数据类型,例如在此情况下使用"long"作为"sum",如下所示:
int[] arr = new int[] { Int32.MaxValue, 1 };
long sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
同样的改进方法也适用于其他整数数据类型,例如short和sbyte。对于无符号整数数据类型的数组,如uint、ushort和byte,使用无符号长整型(ulong)可以避免溢出异常。
使用for循环解决方案的速度也比Linq.Sum()快得多。
为了实现更快的运行速度,HPCsharp nuget包实现了所有这些.Sum()版本,以及SIMD/SSE版本和多核并行版本,性能提高了许多倍。