私はyieldキーワードをよりよく理解しようとしています。十分理解できると思うので、いくつかのテストを実行しましたが、その結果に驚かされました。yieldキーワードとLINQを理解する
私はそれだけではなく、数まで全範囲をループしていることを示す次の出力を取得し、以下のコードを実行した場合4.
public void DoIt()
{
Console.WriteLine("Method Call");
var results = GetData(Enumerable.Range(1, 10));
Console.WriteLine("LINQ");
var filtered = results.Where(x => x == 4);
Console.WriteLine("Start result loop");
foreach (var item in filtered)
{
Console.WriteLine("Item is " + item);
}
}
private IEnumerable<int> GetData(IEnumerable<int> Input)
{
foreach (int item in Input)
{
if (item % 2 == 0)
{
Console.WriteLine("Found " + item);
yield return item;
}
}
}
出力:
Method Call
LINQ
Start result loop
Found 2
Found 4
Item is 4
Found 6
Found 8
Found 10
の場合私は以下のコードを実行して、それが4に達してから停止することを示します。
public void DoIt()
{
Console.WriteLine("Method Call");
var results = GetData(Enumerable.Range(1, 10));
Console.WriteLine("Start result loop");
foreach (var item in results)
{
if (item == 4)
{
Console.WriteLine("Item is " + item);
break;
}
}
}
private IEnumerable<int> GetData(IEnumerable<int> Input)
{
foreach (int item in Input)
{
if (item % 2 == 0)
{
Console.WriteLine("Found " + item);
yield return item;
}
}
}
出力:私は何かをunderstadingいないよしかし、LINQは、私はそれを行うことを期待するものの反対をやっているかのように見えると思います
Method Call
Start result loop
Found 2
Found 4
Item is 4
?私はLINQでもyieldと遅延実行を使用していましたが、最初のコードセットでは2番目のコードセットの結果が同じになると思います。
'Where'は結果をフィルタリングし、項目が述語を満たすときに結果を返すことを止めることはありません。一方、述語が満たされると、あなたの手動の 'foreach'ループが壊れます... –