你可以调用Sum
三次,但这样会变慢,因为它会进行三次循环。
例如:
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);
由于延迟执行,每次都会重新评估
Where
调用,尽管在您的情况下这并不是什么问题。通过调用
ToArray
可以避免这种情况,但这将导致数组分配。(而且它仍然会运行三个循环)
然而,除非您有大量条目或在紧密循环中运行此代码,否则无需担心性能。
编辑:如果您真的想使用LINQ,可以误用
Aggregate
,如下所示:
int totalWeight, totalLength, items;
list.Aggregate((a, b) => {
weight += detail.GrossWeight;
length += detail.Length;
items += detail.NrDistaff;
return a;
});
这是极其丑陋的代码,但是执行效率几乎和直接循环一样好。
你也可以在累加器中进行求和(见下面的示例),但这会为列表中的每个项分配一个临时对象,这是一个愚蠢的想法。(匿名类型是不可变的)
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
}
);