Ein Problem bei den obigen for-Schleifenlösungen besteht darin, dass für das folgende Eingabearray mit allen positiven Werten das Summenergebnis negativ ist:
int[] arr = new int[] { Int32.MaxValue, 1 };
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Console.WriteLine(sum);
Die Summe ist -2147483648, da das positive Ergebnis für den Datentyp int zu groß ist und in einen negativen Wert überläuft.
Für dasselbe Eingabearray führen die Vorschläge von arr.Sum () dazu, dass eine Überlaufausnahme ausgelöst wird.
Eine robustere Lösung besteht darin, einen größeren Datentyp, wie in diesem Fall einen "langen", für die "Summe" wie folgt zu verwenden:
int[] arr = new int[] { Int32.MaxValue, 1 };
long sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Die gleiche Verbesserung gilt für die Summierung anderer ganzzahliger Datentypen wie Short und Sbyte. Bei Arrays mit vorzeichenlosen ganzzahligen Datentypen wie uint, ushort und byte wird durch die Verwendung eines vorzeichenlosen Long (ulong) für die Summe die Überlaufausnahme vermieden.
Die for-Schleifenlösung ist auch um ein Vielfaches schneller als Linq .Sum ()
Um noch schneller zu laufen, implementiert das HPCsharp-Nuget-Paket alle diese .Sum () -Versionen sowie SIMD / SSE-Versionen und parallele Multi-Core-Versionen für eine um ein Vielfaches schnellere Leistung.