2010-12-04 21 views
91

Tengo una lista de objetos. Una propiedad de la entrada de objeto individual es la cantidad. ¿Cómo obtengo la suma de la cantidad?C# Lista de objetos, cómo obtengo la suma de una propiedad

Si mi lista era de tipo double que puede ser capaz de hacer algo como esto:

double total = myList.Sum(); 

Sin embargo, quiero algo similar a esto, sin embargo, esta sintaxis es incorrecta.

double total = myList.amount.Sum(); 

¿Cómo debo proceder para lograr esto? Me encantaría usar la función Sum si es posible en lugar de recorrer y calcular el valor.

Respuesta

181
using System.Linq; 

...

double total = myList.Sum(item => item.Amount); 
+8

¿Este rápido que foreach de interés? – Coops

+3

También estoy interesado en la pregunta de @ CodeBlend. ¿Este cálculo será más rápido que un ciclo for? – rex

+4

Asegúrese de tener una instrucción using para System.Linq – ADH

26

Y si tiene que hacerlo en los artículos que cumplan una condición específica ...

double total = myList.Where(item => item.Name == "Eggs").Sum(item => item.Amount); 
-2

Aquí es código de ejemplo que podría funcionar para hacer tal prueba:

var f = 10000000; 
var p = new int[f]; 

for(int i = 0; i < f; ++i) 
{ 
    p[i] = i % 2; 
} 

var time = DateTime.Now; 
p.Sum(); 
Console.WriteLine(DateTime.Now - time); 

int x = 0; 
time = DateTime.Now; 
foreach(var item in p){ 
    x += item; 
} 
Console.WriteLine(DateTime.Now - time); 

x = 0; 
time = DateTime.Now; 
for(int i = 0, j = f; i < j; ++i){ 
    x += p[i]; 
} 
Console.WriteLine(DateTime.Now - time); 

El mismo ejemplo fo r objeto complejo es:

void Main() 
{ 
    var f = 10000000; 
    var p = new Test[f]; 

    for(int i = 0; i < f; ++i) 
    { 
     p[i] = new Test(); 
     p[i].Property = i % 2; 
    } 

    var time = DateTime.Now; 
    p.Sum(k => k.Property); 
    Console.WriteLine(DateTime.Now - time); 

    int x = 0; 
    time = DateTime.Now; 
    foreach(var item in p){ 
     x += item.Property; 
    } 
    Console.WriteLine(DateTime.Now - time); 

    x = 0; 
    time = DateTime.Now; 
    for(int i = 0, j = f; i < j; ++i){ 
     x += p[i].Property; 
    } 
    Console.WriteLine(DateTime.Now - time); 
} 

class Test 
{ 
    public int Property { get; set; } 
} 

Mis resultados con las optimizaciones del compilador off son:

00:00:00.0570370 : Sum() 
00:00:00.0250180 : Foreach() 
00:00:00.0430272 : For(...) 

y para la segunda prueba son:

00:00:00.1450955 : Sum() 
00:00:00.0650430 : Foreach() 
00:00:00.0690510 : For() 

parece que LINQ es generalmente más lento que foreach (...) pero lo que es extraño para mí es que foreach (...) parece ser más rápido que for loop.

+1

para referencia futura, eche un vistazo a 'Cronómetro' en' System.Diagnostics' ya que es una grabadora de tiempo de alto rendimiento. (No te recomendé por debajo) –

+1

No uses 'DateTime.Now' para medir. Tiene un rendimiento terrible ya que siempre regresa la hora local. 'DateTime.UtcNow' es más rápido; sin embargo, todavía no usa una resolución tan alta como la clase 'Cronómetro'. – taffer

+2

Esto no responde la pregunta. –

4

Otra alternativa:

myPlanetsList.Select(i => i.Moons).Sum(); 
+1

En lugar de '' .Select (i => i.Moons) .Sum() '' 'puedes usar' '' .Sum (i => i.Moons) '' – Mason

+1

@Mason, correcto y eso es cómo Alex se acercó al problema en su respuesta anterior, así que simplemente proporcioné una forma diferente de hacer lo mismo. – usefulBee

+1

Ah sí, lo siento por mi error. – Mason

Cuestiones relacionadas