2010-03-10 3 views
64

Gibt es einen besseren kürzeren Weg als das Iterieren über das Array?Wie fasst man ein Array von ganzen Zahlen in C zusammen?

int[] arr = new int[] { 1, 2, 3 }; 
int sum = 0; 
for (int i = 0; i < arr.Length; i++) 
{ 
    sum += arr[i]; 
} 

Klarstellung:

Besser bedeutet Primärreiniger Code aber Hinweise auf Leistungsverbesserung sind auch willkommen. (Wie bereits erwähnt: große Arrays teilen).


Es ist nicht wie ich war auf der Suche nach Verbesserung Killer Leistung - ich fragte mich, ob diese sehr Art von syntaktischer Zucker nicht bereits vorhanden war: „Es gibt String.Join - was zum Teufel über int []? ".

+2

Besser in welcher Weise? Schneller? Weniger geschriebener Code? –

+4

Die Leute sind heutzutage so komisch. "Wenn es für etwas noch keine Funktion gibt, ist es falsch". Wie viel einfacher kannst du bekommen; Iteriere über das Array, füge sie zusammen. Ja, –

+2

Auch LOL bei "Cleaner Code". Was denkst du, was das Array.Sum der Bibliothek macht, wenn du es nennst? –

Antwort

115

Sofern Sie C# 3.5 verwenden können, und LINQ, versuchen

int sum = arr.Sum(); 
+0

Vielen Dank - ich nehme an, Sie verdienen den Marker in diesem Herzschlag Finish. Vor allem, um auf die C# 3.5-Anforderung hinzuweisen. – Filburt

+2

@Filburt/@Thomas: eine kleine Korrektur: es ist C# 3.0. Die **. NET ** - Version, die die Erweiterungsmethode 'Sum' bereitstellt, ist Version 3.5. –

+7

Die Identität Lambda ist nicht erforderlich. Außer um den neuen Mann im Team zu verwirren. – Will

53

Ja, es gibt. Mit .NET 3.5:

int sum = arr.Sum(); 
Console.WriteLine(sum); 

Wenn Sie nicht .NET 3.5 verwenden Sie dies tun könnte:

int sum = 0; 
Array.ForEach(arr, delegate(int i) { sum += i; }); 
Console.WriteLine(sum); 
+8

+1 für die Nicht-LINQ-Antwort. –

+1

Warum so eine gewundene Version vor 3.5? Die Foreach-Schleife ist in allen Versionen von C# verfügbar. –

+2

@ Jørn: Das OP bat um einen kürzeren Ansatz. Eine 'foreach' ersetzt nur eine Codezeile durch eine andere und ist nicht kürzer. Abgesehen davon ist eine 'foreach' vollkommen in Ordnung und lesbarer. –

15

mit LINQ:

arr.Sum() 
4

Es hängt davon ab, wie definieren Sie besser . Wenn der Code sauberer aussehen soll, können Sie .Sum() wie in anderen Antworten erwähnt verwenden. Wenn Sie möchten, dass die Operation schnell ausgeführt wird und Sie ein großes Array haben, können Sie sie parallel machen, indem Sie sie in Subsummen aufteilen und dann die Ergebnisse summieren.

+0

+1 Sehr guter Punkt auf Leistungsverbesserung, aber ehrlich gesagt war mein ursprünglicher Wunsch, die Iteration loszuwerden. – Filburt

+0

(niemand erzählt Fil, dass er die Iteration nur ein paar Stufen weiter runter geschoben hat) – Will

+0

@Will: Alter - erwarte nicht, dass ich glaube, wenn ich nicht den Code schreibe, wird Magie passieren ;-) – Filburt

0

Die Verwendung von foreach wäre kürzerer Code, würde aber zur Laufzeit wahrscheinlich genau die gleichen Schritte ausführen, nachdem die JIT-Optimierung den Vergleich mit der Länge im for-loop-Steuerausdruck erkannt hat.

1

Wenn Sie nicht LINQ bevorzugen, ist es besser foreach-Schleife zu verwenden, um Out-of-Index zu vermeiden.

int[] arr = new int[] { 1, 2, 3 }; 
int sum = 0; 
foreach (var item in arr) 
{ 
    sum += item; 
} 
-1

Sie können dies tun, indem Sie eine der beiden Möglichkeiten:

1] int sum = items.Sum(); 
    Or 
2] Array.ForEach(items, x=> sum += x); 
-2

diesen Code Versuchen:

using System; 

namespace Array 
{ 
    class Program 
    { 
     static void Main() 
     { 
      int[] number = new int[] {5, 5, 6, 7}; 

      int sum = 0; 
      for (int i = 0; i <number.Length; i++) 
      { 
       sum += number[i]; 
      } 
      Console.WriteLine(sum); 
     } 
    } 
} 

Das Ergebnis ist:

0

In einem meiner apps, die ich verwendet:

public class ClassBlock 
{ 
    public int[] p; 
    public int Sum 
    { 
     get { int s = 0; Array.ForEach(p, delegate (int i) { s += i; }); return s; } 
    } 
}