摘要:概念延迟执行意味着 LINQ 查询的实际执行是在访问结果时才发生,而不是在定义查询时立即执行。查询本身只是一个描述,直到你遍历或操作结果时才触发执行。
概念
延迟执行意味着 LINQ 查询的实际执行是在访问结果时才发生,而不是在定义查询时立即执行。查询本身只是一个描述,直到你遍历或操作结果时才触发执行。
特点
提高性能:查询执行被延迟到需要时,避免了不必要的计算。数据动态性:在查询执行前,数据源的任何更改都会影响结果。常见场景
使用 IEnumerable(如 Where、Select 等方法返回的结果)。示例
List numbers = new List { 1, 2, 3, 4, 5, 6 };// 定义一个延迟执行的查询var query = numbers.Where(n => n > 3);// 此时查询尚未执行numbers.Add(7);// 遍历查询结果,触发执行foreach (var number in query){Console.WriteLine(number); // 输出: 4, 5, 6, 7}分析
查询 numbers.Where(n => n > 3) 只是定义了一个操作,并未实际执行。当 numbers 在执行前发生了改变(增加了 7),最终结果会包含这个变化。概念
立即执行指在定义 LINQ 查询时,查询就会被立即执行,并将结果存储在内存中。
特点
结果是一个具体的集合或值(如 List、int)。不受数据源后续更改的影响。更适合需要缓存结果或立即使用的场景。使用终结方法,如 ToList、ToArray、Count、First 等。示例
List numbers = new List { 1, 2, 3, 4, 5, 6 };// 定义一个立即执行的查询var result = numbers.Where(n => n > 3).ToList;// 修改数据源numbers.Add(7);// 遍历查询结果foreach (var number in result){Console.WriteLine(number); // 输出: 4, 5, 6}ToList 强制执行查询,结果被存储在 result 中。即使修改了 numbers,result 的值不受影响。执行时间访问结果时才执行查询定义时立即执行性能避免不必要的计算数据量大时可能占用较多内存数据源动态性反映数据源的最新状态结果固定,与后续更改无关多次迭代会重复执行查询每次访问结果都会重新执行查询,因此可能造成性能问题。var query = numbers.Where(n => n > 3); Console.WriteLine(query.Count); // 执行一次 Console.WriteLine(query.Count); // 再次执行数据源的更改
如果数据源在查询执行之间发生变化,结果可能不同。numbers.Add(7); // 修改数据源不可变数据源适合延迟执行
如果数据源是不可变的,延迟执行的风险较低。
来源:面试八股文
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!