Jednym z problemów z powyższymi rozwiązaniami pętli for jest to, że dla następującej tablicy wejściowej ze wszystkimi dodatnimi wartościami suma wyników jest ujemna:
int[] arr = new int[] { Int32.MaxValue, 1 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Console.WriteLine(sum);
Suma wynosi -2147483648, ponieważ wynik dodatni jest zbyt duży dla typu danych int i powoduje przepełnienie do wartości ujemnej.
Dla tej samej tablicy wejściowej sugestie arr.Sum () powodują zgłoszenie wyjątku przepełnienia.
Bardziej niezawodnym rozwiązaniem jest użycie większego typu danych, takiego jak „long” w tym przypadku, dla „sumy” w następujący sposób:
int[] arr = new int[] { Int32.MaxValue, 1 };
long sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
To samo ulepszenie działa w przypadku sumowania innych typów danych całkowitych, takich jak short i sbyte. W przypadku tablic liczb całkowitych bez znaku, takich jak uint, ushort i bajt, użycie długości bez znaku (ulong) dla sumy pozwala uniknąć wyjątku przepełnienia.
Rozwiązanie pętli for jest również wielokrotnie szybsze niż Linq .Sum ()
Aby działać jeszcze szybciej, pakiet nuget HPCsharp implementuje wszystkie te wersje .Sum (), a także wersje SIMD / SSE i wielordzeniowe wersje równoległe, co zapewnia wielokrotnie wyższą wydajność.