c# - column - linq sum decimal value
C#Lista de objetos, ¿cómo obtengo la suma de una propiedad? (4)
Tengo una lista de objetos. Una propiedad de la entrada de objeto individual es la cantidad. ¿Cómo obtengo la suma de la cantidad?
Si mi lista era de tipo double, puedo 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 lograr esto? Me encantaría usar la función Sum si es posible en lugar de recorrer y calcular el valor.
Aquí hay un código de ejemplo que podría ejecutar para realizar dicha 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 para 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 desactivadas 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 para el bucle.
Otra alternativa:
myPlanetsList.Select(i => i.Moons).Sum();
Y si necesita hacerlo en elementos que coinciden con una condición específica ...
double total = myList.Where(item => item.Name == "Eggs").Sum(item => item.Amount);
using System.Linq;
...
double total = myList.Sum(item => item.Amount);