我試圖更好地理解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;
}
}
}
輸出:
Method Call
Start result loop
Found 2
Found 4
Item is 4
我想我不understading的東西,但它看起來好像LINQ是做什麼,我希望它反其道而行之?我雖然LINQ使用yield和延遲執行,我期望第二組代碼的結果對於第一組代碼是相同的。
'Where'過濾結果,當項目滿足謂詞時,它不會停止返回結果。另一方面,當謂詞滿足時,你的手動'foreach'循環會中斷。 – 2012-03-01 11:26:02