1

一个延迟执行问题。但是,我的问题源于我无法确定为什么有时会延迟执行此执行,而不是其他时间。

代码:

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();

问题:

此代码正在生产中,并按预期工作。我最近在其他地方进行了更改,发现该测试在我们的单元测试中不起作用。当我逐步执行此功能时,会发生以下情况:

  1. 在到达此代码之前,我验证了输入数据。中的所有项目lineItems。每个项目价值.FlatShippingRate
  2. QualifyFreeFlatShipping 是true
  3. 代码执行到达第 4 行的 linq 语句 ( freeFlatItems = etc...)
  4. 的值freeFlatItems保持不变,因为执行继续到第 6 行 ( decimal? freeFlatShippingTotal = etc...)
  5. .Sum在一个空列表中执行。
  6. 到达第 8 ( var globalShippingPromos = etc...) 行时,freeFlatItemsfinally 的值会更新为应有的值。但是... sum 是在之前的值上运行的,我的运费总额不正确。

问题:

  1. 为什么这仍然被推迟?我以为.ToList()强制执行 linq 以生成IList<T>
  2. 为什么这以一致的方式表现不同?(我的测试总是以这种方式运行,生产工作正常,LinqPad 中的这段代码工作正常)。在你提出建议之前,我已经验证了我的测试是正确建立的。通过验证调试器中的输入数据,在测试代码和上述第一步中都如此。
4

2 回答 2

2

1.

这里没有延迟执行。“Where”由 ToList() 强制,“Sum”立即计算并存储在十进制中。错误必须在其他地方

2.

当您在第 8 行之后第二次评估总和时,可以说:

decimal? freeFlatShippingTotal2 = freeFlatItems.Sum(l => l.FlatShippingRate);

然后你得到正确的值吗?那么,freeFlatShippingTotal2 != freeFlatShippingTotal 吗?

于 2010-09-16T12:03:56.037 回答
0

我不认为这是延迟执行的问题。但我可以建议一种更简洁的代码编写方式。

decimal freeFlatShippingTotal = 0.0m;
if(QualifyFreeFlatShipping)
    freeFlatShippingTotal = lineItems.Sum(l => l.FlatShippingRate ?? 0.0m);
于 2010-07-13T17:38:26.667 回答