你可以这样做:
// run the filters once and get List<DataRow> with the matching rows
var list = (from m in month
where <some long expression>
select m).ToList();
// build the summary object
var result = new {
BGCO_MINUTES = list.Sum(m => m["BGCO_MINUTES"] as Decimal?),
_800IB_MINUTES= list.Sum(m => m["800IB_MINUTES"] as Decimal?),
}
这是假设您的 where 子句不仅输入时间长,而且计算成本高。这将每列遍历列表一次。
如果您真的只想迭代列表一次,您可以使用Enumerable.Aggregate来完成,但代码不太优雅(在我看来):
// run the filters once and get List<DataRow> with the matching rows
var a = (from m in month
where <some long expression>
select m)
.Aggregate( new { BGCO_MINUTES = (decimal?)0m,
_800IB_MINUTES = (decimal?)0m },
(ac,v) => new { BGCO_MINUTES = ac.BGCO_MINUTES + (decimal?)v["BGCO_MINUTES"],
_800IB_MINUTES = ac._800IB_MINUTES + (decimal?)v["800IB_MINUTES"] });
就像我说的,我认为它没有第一个版本那么优雅,但它应该可以工作。即使第一个需要与 where 子句(内存成本)匹配的值的临时副本,并且 1 通过每个字段的列表(CPU 成本),我认为它比后一个版本更具可读性 - 确保在使用不太容易理解的版本之前,性能差异是值得的。