È possibile chiamare Sum
tre volte, ma sarà più lento perché renderà tre anelli.
Ad esempio:
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);
A causa di esecuzione ritardata, sarà anche rivalutare il Where
chiamata ogni volta, anche se questo non è una questione nel tuo caso. Questo potrebbe essere evitato chiamando lo ToArray
, ma ciò causerà un'allocazione dell'array. (E gestirà ancora tre loop)
Tuttavia, a meno che non si disponga di un numero molto elevato di voci o si esegua questo codice in un ciclo chiuso, non è necessario preoccuparsi delle prestazioni.
EDIT: Se davvero vuole usare LINQ, si potrebbe abusare Aggregate
, in questo modo:
int totalWeight, totalLength, items;
list.Aggregate((a, b) => {
weight += detail.GrossWeight;
length += detail.Length;
items += detail.NrDistaff;
return a;
});
Questo è fenomenale codice brutto, ma necessario eseguire quasi come un anello dritto.
Si può anche sommare l'accumulatore, (vedi esempio sotto), ma questo alloca un oggetto temporaneo per ogni elemento della lista, che è un'idea stupida. (Tipi anonimi sono immutabili)
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 non è l'ideale e la fine della manipolazione dei dati e non c'è ancora niente di sbagliato in un ciclo for. – SLaks
Divertente anche se @SLaks è uno dei rari casi in cui LINQ non offre una soluzione ragionevole. – PeterX