查詢定義時僅捕獲操作委派,真正執行在列舉時。因此列舉前若修改資料源,下次列舉會反映最新狀態:
static void Main()
{
int[] collection = { 10, 11, 12, 13, 14 };
var result = from i in collection select DoubleInt(i);
foreach (var i in result) Console.WriteLine(i); // 20,22,24,26,28
Console.WriteLine("Change data source:");
for (int i = 0; i < collection.Length; i++) collection[i] += 10;
foreach (var i in result) Console.WriteLine(i); // 40,42,44,46,48
}
static int DoubleInt(int i) => i * 2;
result 只是查詢定義(運算式樹/委派鏈),不包含結果資料。foreach 列舉都會重新對當前資料源執行查詢邏輯。