2017-07-10 6 views
-3

linqを使用している設定メンバーが動作していないように見えた問題に遭遇しました。だから例を示すためにこの非常に特殊なコードを作った。LINQ ForEachがメンバーを設定していない

なぜSomeClassインスタンスのメンバーが最初のForEachに設定されていないのですか?

using System; 
using System.Linq; 

public class Program 
{ 
    class SomeClass 
    { 
     public float val = 0f; 
    } 

    public static void Main() 
    { 
     var arr = Enumerable.Range(0, 1).Select(x => new SomeClass()); 

     arr.ToList().ForEach(x => x.val = 2f); 

     // Outputs 0 
     Console.WriteLine(arr.Select(x => x.val).First()); 

     var list = arr.ToList(); 

     list.ForEach(x => x.val = 2f); 

     // Outputs 2 
     Console.WriteLine(list.Select(x => x.val).First()); 
    } 
} 

https://dotnetfiddle.net/j0oLUh

+0

理由だけではなく 'Enumerable.Range(0、1).Select(X =>新しい工ass {ヴァル= 2F});'? –

+0

このテストはそれだけで愚かです。それは私が遭遇した問題を示しています。 – quano

答えて

6

あなたはこれが原因ToList()の作品、コレクションでクエリを保存することはありません:あなたのarr.ToList()コレクションを作成しますが、それはどこにも保存されたことがないです

var list = Enumerable.Range(0, 1).Select(x => new SomeClass()).ToList(); 
list.ForEach(x => x.val = 2f); 

注意。したがって、SomeClassのインスタンスも一時的なものです。 arrにアクセスするたびに、新しいインスタンスが作成されます。 LINQの遅延実行についてお読みください。

+0

'ForEach'は' List 'メソッドであり、' LinQ'メソッドではないということも付け加えてください。 –

+0

@CamiloTerevinto:true、それは 'List <>'のメソッドです。しかし、私はそれがこの場合重要ではないと思う。 'foreach'を使うのなら同じです。 –

+0

ええ、私は知っている、ただタイトルを修正する:) –

0

LINQの選択クエリ.ToListを追加()

関連する問題