Puede llamar Sum
tres veces, pero será más lento, ya que hará tres bucles.
Por ejemplo:
var list = ArticleLedgerEntries.Where(pd => pd.LedgerEntryType == LedgerEntryTypeTypes.Unload
&& pd.InventoryType == InventoryTypes.Finished))
var totalWeight = list.Sum(pd => pd.GrossWeight);
var totalLength = list.Sum(pd => pd.Length);
var items = list.Sum(pd => pd.NrDistaff);
Debido a la ejecución retardada, que también volverá a evaluar la Where
llamada cada vez, aunque eso no es un problema tal en su caso. Esto podría evitarse llamando al ToArray
, pero eso causará una asignación de matriz. (Y todavía correría tres bucles)
Sin embargo, a menos que tenga una gran cantidad de entradas o esté ejecutando este código en un bucle cerrado, no necesita preocuparse por el rendimiento.
EDITAR: Si realmente desea utilizar LINQ, se podría mal uso Aggregate
, así:
int totalWeight, totalLength, items;
list.Aggregate((a, b) => {
weight += detail.GrossWeight;
length += detail.Length;
items += detail.NrDistaff;
return a;
});
Este es el código extraordinariamente feo, pero debe realizar casi tan bien como lazo recto.
También podría sumar en el acumulador, (vea el ejemplo a continuación), pero esto asignaría un objeto temporal para cada elemento en su lista, lo cual es una idea tonta. (Los tipos anónimos son inmutables)
var totals = list.Aggregate(
new { Weight = 0, Length = 0, Items = 0},
(t, pd) => new {
Weight = t.Weight + pd.GrossWeight,
Length = t.Length + pd.Length,
Items = t.Items + pd.NrDistaff
}
);
LINQ no es el único y final de la manipulación de datos, y todavía no hay nada de malo con un bucle for. – SLaks
Aunque gracioso @SLaks, este es uno de los pocos casos en que LINQ no ofrece una solución razonable. – PeterX