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. var globalShippingPromos = etc...8 行目 ( )に到達すると、 freeFlatItemsfinallyの値が本来あるべき値に更新されます。しかし...合計は以前の値で実行され、私の配送合計は正しくありません。

質問):

  1. なぜこれはまだ遅れているのですか?.ToList()私はlinqの実行を強制して生成すると思ったIList<T>
  2. これが一貫した方法で異なる動作をするのはなぜですか? (私のテストは常にこのように動作し、本番環境は正常に動作し、LinqPad のこのコードは正常に動作します)。そして、あなたがそれを提案する前に、私のテストが正しく構築されていることを検証しました. テスト コードと上記の手順 1 の両方で、デバッガーで入力データを検証します。
4

2 に答える 2

2

1.1。

ここでは実行の遅延はありません。「Where」はToList()によって強制され、「Sum」はすぐに評価され、小数で格納されます。エラーはどこかにある必要があります

2.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 に答える