簡體   English   中英

理解yield關鍵字和LINQ

[英]Understanding the yield keyword and LINQ

我試圖更好地理解yield關鍵字,我認為我對它有足夠的理解,所以我進行了一些測試,但是我對結果感到驚訝。

如果我運行下面的代碼,我會得到以下輸出,表明它在整個范圍內循環,而不僅僅是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

我想我並沒有強調一些東西,但看起來LINQ正好與我的預期相反? 我雖然LINQ也使用了yield和延遲執行,但我希望第二組代碼的結果對於第一組代碼是相同的。

它確實使用延遲執行。 LINQ Where檢查輸入的所有元素是否可枚舉,當它到達找到的第一個元素時它不會停止。 這就是First所做的。

如果您更改了Where to First ,或者您從第二個示例中刪除了break ,那么您的第一個示例將返回與第二個示例相同的示例。

我認為你的基本邏輯錯了,而不是LINQ。 你的第一個例子必須迭代整個范圍,因為where-condition必須找到所有等於4的值,而不僅僅是第一個值,即等於4。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM