Um problema com as soluções de loop for acima é que para a seguinte matriz de entrada com todos os valores positivos, o resultado da soma é negativo:
int[] arr = new int[] { Int32.MaxValue, 1 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Console.WriteLine(sum);
A soma é -2147483648, pois o resultado positivo é muito grande para o tipo de dados int e transborda para um valor negativo.
Para a mesma matriz de entrada, as sugestões arr.Sum () fazem com que uma exceção de estouro seja lançada.
Uma solução mais robusta é usar um tipo de dados maior, como um "longo" neste caso, para a "soma" da seguinte maneira:
int[] arr = new int[] { Int32.MaxValue, 1 };
long sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
A mesma melhoria funciona para a soma de outros tipos de dados inteiros, como short e sbyte. Para matrizes de tipos de dados inteiros sem sinal, como uint, ushort e byte, o uso de um longo sem sinal (ulong) para a soma evita a exceção de estouro.
A solução do loop for também é muitas vezes mais rápida que Linq .Sum ()
Para funcionar ainda mais rápido, o pacote HPCsharp nuget implementa todas essas versões .Sum (), bem como versões SIMD / SSE e paralelas com vários núcleos, para desempenho muitas vezes mais rápido.