2010-03-10 27 views
64

¿Hay una manera mejor más corta que la iteración en la matriz?Cómo resumir una matriz de enteros en C#

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

aclaración:

Mejor primaria significa que un código más limpio pero que señala en la mejora del rendimiento también son bienvenidos. (Como ya se mencionó: dividir arreglos grandes).


No es como yo estaba buscando la mejora del rendimiento asesino - Me preguntaba si este mismo tipo de azúcar sintáctico no estaba ya disponible: No" es string.join - ¿qué diablos acerca int []? ".

+2

mejor en qué sentido? ¿Más rápido? Menos código escrito? –

+4

La gente es tan rara en estos días. "Si todavía no hay una función para algo, está mal". Cuánto más simple puedes obtener; iterar sobre la matriz, agréguelos. Yeesh. –

+2

Además, LOL en "código de limpiador". ¿Qué crees que está haciendo Array.Sum de la biblioteca cuando lo llamas? –

Respuesta

115

condición de que usted puede utilizar C# 3.5 y LINQ, tratar

int sum = arr.Sum(); 
+0

Muchas gracias, supongo que mereces el marcador en este final de latido. Especialmente para señalar el requisito de C# 3.5. – Filburt

+2

@Filburt/@Thomas: una corrección menor: es C# 3.0. La versión ** .NET ** que proporciona el método de extensión 'Suma 'es la versión 3.5. –

+7

La identidad lambda no es necesaria. Excepto para confundir al nuevo tipo en el equipo. – Will

53

Sí hay. Con .NET 3.5:

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

Si usted no está utilizando .NET 3.5 que podría hacer esto:

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

+1 para la respuesta no LINQ. –

+1

¿Por qué una versión tan complicada pre 3.5? El ciclo 'foreach' está disponible en todas las versiones de C#. –

+2

@ Jørn: el OP pidió un enfoque más corto. Un 'foreach' simplemente sustituye una línea de código por otro y no es más corto. Aparte de eso, un 'foreach' está perfectamente bien y es más legible. –

15

con LINQ:

arr.Sum() 
4

Depende de cómo se defina mejor . Si desea que el código se vea más limpio, puede usar .Sum() como se menciona en otras respuestas. Si desea que la operación se ejecute rápidamente y tenga una matriz grande, puede hacerla paralela dividiéndola en sumas secundarias y luego sumar los resultados.

+0

+1 Muy buen punto en la mejora del rendimiento, pero honestamente, mi deseo inicial era deshacerse de la iteración. – Filburt

+0

(nadie le dice a Fil que acaba de empujar la iteración un par de niveles en la pila) – Will

+0

@Will: Amigo - no esperes que crea si no escribo el código; la magia sucederá ;-) – Filburt

0

El uso de foreach sería código más corto, pero probablemente hacer exactamente los mismos pasos en tiempo de ejecución después de la optimización JIT reconoce la comparación con la longitud de la expresión para el control de bucle.

1

Si no prefiere LINQ, es mejor utilizar bucle foreach para evitar fuera del índice.

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

Puede hacerlo por cualquiera de las formas:

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

probar este código:

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

El resultado es:

0

En una de mis aplicaciones que utilizan:

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