Одна из проблем с решениями цикла 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);
Сумма равна -2147483648, поскольку положительный результат слишком велик для типа данных int и принимает отрицательное значение.
Для того же входного массива предложения arr.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, использование unsigned long (ulong) для суммы позволяет избежать исключения переполнения.
Решение цикла for также во много раз быстрее, чем Linq .Sum ()
Чтобы работать еще быстрее, пакет HPCsharp nuget реализует все эти версии .Sum (), а также версии SIMD / SSE и многоядерные параллельные версии, что во много раз увеличивает производительность.