Możesz zadzwonić pod numer Sum
trzy razy, ale będzie wolniej, ponieważ spowoduje utworzenie trzech pętli.
Na przykład:
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);
powodu opóźnionej realizacji, będzie to również ponownej oceny połączenia Where
za każdym razem, mimo że nie jest takim problemem w Twoim przypadku. Można tego uniknąć, wywołując ToArray
, ale spowoduje to przydzielenie tablicy. (I nadal będzie działał trzy pętle)
Jednak, jeśli nie masz dużej liczby wpisów lub uruchamiasz ten kod w ciasnej pętli, nie musisz martwić się o wydajność.
EDIT: Jeśli naprawdę chcesz używać LINQ, można nadużywać Aggregate
, tak:
int totalWeight, totalLength, items;
list.Aggregate((a, b) => {
weight += detail.GrossWeight;
length += detail.Length;
items += detail.NrDistaff;
return a;
});
To fenomenalnie brzydki kod, ale należy wykonać niemal jak również prosta pętla.
Można również podsumować akumulator, (patrz przykład poniżej), ale to przydzieli tymczasowy obiekt dla każdego elementu na liście, co jest głupim pomysłem. (Typy anonimowych są niezmienne)
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 nie jest całkowitą manipulacją danymi i nie ma w niej nic złego w pętli for. – SLaks
Zabawne chociaż @SLaks, że jest to jeden z nielicznych przypadków, w których LINQ nie oferuje rozsądnego rozwiązania. – PeterX