Un problème avec les solutions de boucle for ci-dessus est que pour le tableau d'entrée suivant avec toutes les valeurs positives, le résultat de la somme est négatif:
int[] arr = new int[] { Int32.MaxValue, 1 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Console.WriteLine(sum);
La somme est -2147483648, car le résultat positif est trop grand pour le type de données int et déborde en une valeur négative.
Pour le même tableau d'entrée, les suggestions arr.Sum () provoquent la levée d'une exception de débordement.
Une solution plus robuste consiste à utiliser un type de données plus grand, tel qu'un "long" dans ce cas, pour la "somme" comme suit:
int[] arr = new int[] { Int32.MaxValue, 1 };
long sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
La même amélioration fonctionne pour la sommation d'autres types de données entiers, tels que short et sbyte. Pour les tableaux de types de données entiers non signés tels que uint, ushort et byte, l'utilisation d'un unsigned long (ulong) pour la somme évite l'exception de dépassement de capacité.
La solution de la boucle for est également plusieurs fois plus rapide que Linq .Sum ()
Pour fonctionner encore plus vite, le package HPCsharp nuget implémente toutes ces versions .Sum () ainsi que les versions SIMD / SSE et les versions parallèles multicœurs, pour des performances beaucoup plus rapides.