此 IS 延迟执行问题。但是,我的问题源于这样一个事实:我无法确定为什么这种执行有时会延迟,而不是其他时间。
代码:
IList<LineItem> freeFlatItems = new List<LineItem>();
if(QualifyFreeFlatShipping)
freeFlatItems = lineItems.Where(l => l.FlatShippingRate != null).ToList();
decimal? freeFlatShippingTotal = freeFlatItems.Sum(l => l.FlatShippingRate);
var globalShippingPromos = _promoService.GetGlobalShippingPromos();
问题:
此代码已投入生产,并按预期工作。我最近在其他地方进行了更改,发现此测试在我们的单元测试中无效。当我单步执行此功能时,会发生以下情况:
lineItems
中的所有项目。每个商品都有作为.FlatShippingRate
true
freeFlatItems = etc...
)freeFlatItems
的值保持不变,因为执行继续到第6行(decimal? freeFlatShippingTotal = etc...
).Sum
在空列表中执行。var globalShippingPromos = etc...
)后,freeFlatItems
的值最终会更新为应该的内容。但是...总和是按上一个值运行的,而且我的运费总额不正确。问题:
.ToList()
强制执行linq来生成IList<T>
答案 0 :(得分:2)
1
此处没有延迟执行。 ToList()强制“Where”,立即计算“Sum”并存储在十进制中。错误必须在其他地方
2
当您在第8行之后第二次评估总和时,请说:
decimal? freeFlatShippingTotal2 = freeFlatItems.Sum(l => l.FlatShippingRate);
然后你得到正确的价值?那么,freeFlatShippingTotal2!= freeFlatShippingTotal?
答案 1 :(得分:0)
我不认为这是延迟执行的问题。但我可以建议一种更清晰的方式来编写代码。
decimal freeFlatShippingTotal = 0.0m;
if(QualifyFreeFlatShipping)
freeFlatShippingTotal = lineItems.Sum(l => l.FlatShippingRate ?? 0.0m);