あなたはLINQの拡張メソッドを使用するか、クエリ演算子を使用するか、可算集合を定義するためにLINQを使用すると、アプリケーション が実際にLINQ 延長した時点でコレクションを構築しません。メソッドが実行されます。コレクションは、 を反復処理するときにのみ列挙されます。つまり、元の コレクションのデータは、LINQクエリを実行してクエリが識別するデータを取得する間に変更される可能性があります。最新のデータである を常に取得します。私は次のコードで書かれているのLINQと遅延評価
ジョン・シャープによって書かれたステップバイ
のMicrosoft Visual C#の2013ステップ:
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<int> res = numbers.FindAll(a => a > 0).Select(b => b).ToList();
numbers.Add(99);
foreach (int item in res)
Console.Write(item + ", ");
上記のコードの結果は怒鳴るようになります。
1,2,3,4,5,
なぜこのようになりますか?私はFunc
、Action
およびPredicate
について知っていますが、私はここで何が起こっているのか理解できません。上記の定義に基づいて、コードは合理的ではありません。
最後にToList()を削除してみてください –
@MatiasCicero私は試しましたが効果はありませんでした。 – Media
'ToList()'は* new * list( 'res')を作成して全てのアイテムをコピーしますが、* old *(' numbers')に追加します –