2017-01-03 12 views
2

は、さまざまなLINQのチュートリアルを読んだ後、私はそれはボンネットの下に動作し、私は誰かが私は次のコード例を持っている質問のいくつかを確認することができ期待しています正確にどのように疑問に思って:LINQ IEnumerableはどのようにして動作しますか?

// The Three Parts of a LINQ Query: 
// 1. Data source. 
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; 

// 2. Query creation. 
// numQuery is an IEnumerable<int> 
var numQuery = 
    from num in numbers 
    where (num % 2) == 0 
    select num; 

// 3. Query execution. 
foreach (int num in numQuery) 
{ 
    Console.Write("{0,1} ", num); 
} 

私の質問は、パート2を参照してください。

  1. ここでは、LINQ構文を使用してIEnumerableオブジェクトを作成しています。 これはListなどの foreachステートメント内で使用される他のIEnumerableオブジェクトと同じですか?
  2. すべてのIEnumerablesと同様に、内容はforeach文を使用して反復されます。私のクエリは、遅延実行を使用してLINQ IEnumerablesから来る - 実際に集められたIEnumerableの内容はいつですか? GetEnumerator()が呼び出されたときですか?

私の前提は、LINQクエリから生成されたオブジェクトが、GetEnumerator関数内でコードを生成し、LINQ構文で表される方法でデータを取得することです。ちょうど私の推測...私はLINQについて完全に間違っていると思っていない限り...

+0

私のEdulinqブログシリーズを読むことができます:https://codeblog.jonskeet.uk/category/edulinq/ –

+0

おそらくこれはhttp://stackoverflow.com/questions/41257165/working-of-ienumerator-inに役立ちます-c-sharp/41257284#41257284 – wkl

+3

特定の問題がありますか、まったくわからないことはありますか?特定の質問に答えるのは簡単でしょう*フードの下に*が広すぎます。あなたの質問の最後の部分については、[this](http://stackoverflow.com/q/3894490/1997232)を参照してください。 – Sinatr

答えて

0

あなたの質問はどちらも密接に関連しています。

はい、違いがあります。 LINQクエリ演算子デコレータシーケンスとこの修飾により、遅延実行が有効になります。 デコレータ・シーケンスは、ラップされたシーケンスに適用する問合せも認識している別のシーケンス(ご使用の場合はint[])のラッパーです。 GetEnumerator().MoveNext()コールで実際の実行が行われます。

+0

返信いただきありがとうございます。 IEnumerable/IEnumerator内のコード/ロジックは、LINQクエリの構文に基づいて動的に生成されますか?そして、MoveNextが呼び出されるまで(データを取得するために動的に生成されたコードを使用して)、データが列挙子によって取り出されないので、_deferred_ですか? – Brummy

+0

このようなもの。 LINQクエリは、内部ソースコレクションと述語(またはセレクタ、またはクエリタイプに応じてsmth else)を持つ 'IEnumerable '(たとえば 'WhereEnumerableIterator ')の実装を返します。列挙されるときだけ、この論理が評価されます。 –

関連する問題