0

WriteLine の (私の) 予想される出力が表示されない理由を誰か説明できますか? VS でデバッグしているときに表示され、「結果」を更新して、VS 内のローカル ウィンドウでその内容を確認できます。THX

Func<Category, bool> del = (Category cat) => { 
    System.Console.WriteLine(cat.CategoryName);
    return cat.CategoryID > 1; 
};


NorthwindEntities nw = new NorthwindEntities();

var result = nw.Categories.Where<Category>(del);

Console.Read();
4

4 に答える 4

5

LINQ 構造は遅延評価されます。つまり、列挙から項目が要求されるまで、ラムダ関数は呼び出されません (その場合でも、一度にすべてが要求されるとは限りません)。これにより、値がコンソールに出力されます。

var result = nw.Categories.Where<Category>(del).ToList();

ここでの意味に注意してください。これを行うと、値がコンソールに2 回出力されます。

var result = nw.Categories.Where<Category>(del);
var otherVariable = result.ToList();
foreach(var item in result)
{
   // do something
}

これは、LINQ クエリに副作用のあるコードを含めないようにする必要がある正当な理由です。

于 2013-03-20T14:17:27.657 に答える
1

resultsラムダを実行するには、何かをする必要があります。これを試して:

var result = nw.Categories.Where<Category>(del);
foreach(var r in result)
{
}

resultラムダを列挙すると、呼び出されます。

于 2013-03-20T14:16:53.250 に答える
1

おそらく、クエリを具体化する必要があります。あなたresultは であるため、デリゲートは が実際に列挙されIEnumerableた場合にのみファイルします。result

これを試して:var result = nw.Categories.Where<Category>(del).ToList();

于 2013-03-20T14:17:35.950 に答える
0

これは によるものlazy evaluationです。関数は実際にはまだ実行されていないため、自分で列挙するか、次のようにするまで列挙されません。

Category[] categories = nw.Categories.Where<Category>(del).ToArray();

これを呼び出すと、評価が呼び出されます。これについてはウェブで読むことができますが、ここに記事があります。

于 2013-03-20T14:20:05.087 に答える