2012-03-01 6 views
5

私は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番目のコードセットの結果が同じになると思います。

+0

'Where'は結果をフィルタリングし、項目が述語を満たすときに結果を返すことを止めることはありません。一方、述語が満たされると、あなたの手動の 'foreach'ループが壊れます... –

答えて

12

遅延実行が使用されます。 LINQ Whereは、入力列挙可能な要素のすべてをチェックし、見つかった最初の要素に到達すると停止しません。これは、Firstの機能です。あなたはFirstWhereを変更した場合

あなたの最初の例では、第二の例と同じように返すか、第二の例からbreakを削除した場合。

2

私はLINQではなく、あなたの基本的なロジックが間違っていると思います。最初の値は4に等しいだけでなく、4に等しいすべての値を見つける必要があるため、最初の例では範囲全体を反復処理する必要があります。

関連する問題