您可以调用Sum
3 次,但会慢一些,因为它会产生 3 个循环。
例如:
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
}
);