LINQ何时执行更新的数据列表?

Phi*_*hil 3 c# linq

我很好奇执行时,特别是在更新数据和第二次调用时.是否在使用查询变量时,例如在foreach语句中?或者,当我更新列表时,例如nums [1] = 99?

    int[] nums = { 1, -2, 3, 0, -4, 5 };

    var posNums = from n in nums
                  where n > 0
                  select n;

    foreach (int i in posNums)
        Console.Write("" + i + " ");
    Console.WriteLine();

    nums[1] = 99;

    foreach (int i in posNums)
        Console.Write("" + i + " "); 
    Console.WriteLine(); 
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 6

Linq推迟分析,直到迭代序列,通过Foreach语句或获取迭代器.请注意,在引擎盖下,.ToArray().ToList调用执行这样的迭代.你可以通过使用方法调用版本并按F9断点传入的lambda来看到这一点.

var posNums = nums
    .Where(n => n > 0);
Run Code Online (Sandbox Code Playgroud)

请注意,因为Linq函数创建枚举器,所以每次迭代序列时它们也会重新评估所有查询函数,因此如果要执行多个(或嵌套),使用.ToArray()将集合复制到内存通常是有利的. !)迭代查询结果.如果要对更改的数据执行多次迭代,则需要重用相同的Linq结果.

如果您很好奇,还可以在参考源中查看.NET框架用于各种Linq语句的源代码