2010-03-10 17 views
64

Czy istnieje lepszy krótszy sposób niż iterowanie w tablicy?Jak podsumować tablicę liczb całkowitych w C#

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

wyjaśnienie:

Lepsze podstawowy oznacza czystsze kod, ale wskazówki na temat poprawy wydajności są również mile widziane. (Jak już wspomniano: dzielenie dużych tablic).


To nie tak szukałem poprawy wydajności killer - Zastanawiałem się, czy to bardzo miłe z cukru składniowej nie był już dostępny: There”to string.join - co do cholery o int []? ".

+2

lepiej w jaki sposób? Szybciej? Mniej napisany kod? –

+4

Ludzie są teraz tacy dziwni. "Jeśli nie ma już funkcji dla czegoś, to jest źle". O ileż łatwiej można dostać; iteruj po tablicy, dodaj je razem. Yeesh. –

+2

Również LOL w "czystszym kodzie". Jak myślisz, co robi biblioteka Array.Sum, kiedy ją nazywasz? –

Odpowiedz

115

Pod warunkiem, że można użyć C# 3.5 i LINQ, spróbuj

int sum = arr.Sum(); 
+0

Wielkie dzięki - zakładam, że zasługujesz na znacznik w tym bicie serca. Zwłaszcza w celu wskazania wymagań C# 3.5. – Filburt

+2

@Filburt/@Thomas: drobna korekta: jest to C# 3.0. Wersja ** .NET **, która udostępnia metodę rozszerzenia "Sum", to wersja 3.5. –

+7

Tożsamość lambda nie jest konieczna. Z wyjątkiem zmieszania nowego faceta w zespole. – Will

53

Tak jest. Z .NET 3.5:

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

Jeśli nie używasz .NET 3.5 można to zrobić:

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

+1 dla odpowiedzi innej niż LINQ. –

+1

Dlaczego taka zawiłowana wersja pre 3.5? Pętla 'foreach' jest dostępna we wszystkich wersjach C#. –

+2

@ Jørn: OP zalecił krótsze podejście. 'Foreach' po prostu zastępuje jeden wiersz kodu innym i nie jest krótszy. Poza tym "foreach" jest idealnie w porządku i jest bardziej czytelny. –

4

To zależy od tego, jak zdefiniujemy lepiej . Jeśli chcesz, aby kod wyglądał czysto, możesz użyć .Sum(), jak wspomniano w innych odpowiedziach. Jeśli chcesz, aby operacja przebiegała szybko i masz dużą tablicę, możesz zrobić to równolegle, dzieląc ją na pod-sumy, a następnie sumując wyniki.

+0

+1 Bardzo dobry punkt na poprawę wydajności, ale szczerze moim początkowym życzeniem było pozbycie się iteracji. – Filburt

+0

(nikt nie mówi Filowi, że po prostu przesunął iterację o kilka poziomów w dół stosu) – Will

+0

@Will: Dude - nie oczekuj, że uwierzę, jeśli nie napiszę magii, kod stanie się ;-) – Filburt

0

Używanie foreach będzie krótszym kodem, ale prawdopodobnie wykona dokładnie te same kroki w czasie wykonywania, gdy optymalizacja JIT rozpozna porównanie do długości w wyrażeniu kontrolującym pętlę for.

1

Jeśli nie preferujesz LINQ, lepiej użyć pętli foreach, aby uniknąć indeksu.

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

Można to zrobić za pomocą jednej z metod:

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

Spróbuj kod:

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); 
     } 
    } 
} 

wynik jest:

0

W jednej z moich aplikacji użyłem:

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