3

私は自分のC#コードでランバをデバッグしようとしていますが、ラムダのどこにブレークポイントを置いても、そこに入らないようです。最初の括弧、最後の括弧、戻り値、値を確認したい変数、考えられるすべてのもの、そしてまだ何もありません。

ラムダ以外の行をデバッグしようとしても問題ありませんが、何が間違っていますか?

ラムダは以下です。

clientProgramList.Items.OfType<SPListItem>().Where(x =>
{
    DateTime doa = x.GetValue<DateTime>("client1");
    DateTime dod = x.GetValue<DateTime>("client2");
    bool date = DateCompare.IsValidClient(enteredDate, endDate, doa, dod); 
    return date;
});
4

3 に答える 3

11

メソッドを呼び出すだけでは、述語はまったく実行Whereされません。

LINQ の遅延実行メソッドにより、戻り値を反復処理しようとするまで述語は実行されません。この場合、無視しているようです。

したがって、次のようにします。

var items = clientProgramList.Items.OfType<SPListItem>().Where(x =>
{
    DateTime doa = x.GetValue<DateTime>("client1");
    DateTime dod = x.GetValue<DateTime>("client2");
    bool date = DateCompare.IsValidClient(enteredDate, endDate, doa, dod); 
    return date;
});

int count = items.Count();

実行しようとすると、ブレークポイントにヒットするはずですCount()

于 2013-01-07T21:39:47.997 に答える
6

そのLINQクエリを呼び出すと、ラムダは呼び出されず、代わりにクエリのみが構築されます。Where句は遅延評価されます (アイテムの反復処理を開始した場合のみ)。ToList()クエリの最後に追加して、ブレークポイントがヒットするかどうかを確認してください。

于 2013-01-07T21:39:57.407 に答える
0

他のコードをデバッグするのと同じ方法でラムダをデバッグすることはできません。ラムダは「レイジー」実行されます。つまり、値が使用されるまで評価されません。それまでは、キューに入れられたクエリです。

追跡しようとしているバグがArgumentExceptionである場合はclientProgramList.Items、それがnullであることを意味している可能性があります。これは、デバッガーで簡単に確認できるものです。

于 2013-01-07T22:07:51.977 に答える