2016-02-05 6 views
5

結果。不一致は私がこれを行うと

しかし、同じロジック、Iは、整数の変数にインクリメント値を代入して、currentPage

int sortOrder = ++currentPage.SortOrder; 
currentPage = metadataResponse.ApplicationType.Pages.Find(
    page => page.SortOrder == sortOrder); 

currentPageが移入されます取得しようとします。

なぜ誰かがうまくいけばいいのですか?

+5

これらは同等ではなく、簡単です。明らかにラムダは複数回評価されています(私は 'Find()'メソッドが何であるかわかりません)、現在のページのソート順を複数回変更しています。 –

+5

照会に副作用のあるラムダ式は使用しないでください。 –

答えて

6

注:私はメソッドが値のコレクションに適用されると仮定します。

最初のコード例では、(ラムダ式は、外側のスコープから撮影した変数の上にクロージャを紹介するので、これが起こっている - それについての詳細は、コードブロックの下を参照)あなたのコレクション内の各要素に対してcurrentPageを増加しています。 2番目のコード例では、currentPageが1回だけインクリメントされます。次のプログラムがどのように動作するかを見てみましょう:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Func1(); 
     Console.WriteLine("\n"); 
     Func2(); 

     Console.ReadKey(); 
    } 

    private static void Func1() 
    { 
     int i = 0; 
     var list = new List<int> { 1, 2, 3 }; 
     list.ForEach(x => Console.WriteLine(++i)); 
    } 

    private static void Func2() 
    { 
     int i = 0; 
     int j = ++i; 
     var list = new List<int> { 1, 2, 3 }; 
     list.ForEach(x => Console.WriteLine(j)); 
    } 
} 

Hereは、ラムダ式で閉鎖についていくつかの詳細情報です。楽しむ! ;-)

関連する問題