Lingq的延迟执行与立即执行

本文通过一个C#代码示例解释了Linq的延迟执行和立即执行的概念。在示例中,展示了当使用Linq查询从数组中筛选偶数时,如何通过延迟执行在不同时刻获取不同的结果。延迟执行允许在需要时才执行查询,而立即执行如ToList()会立即生成结果列表,与原始数据源不再关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引自: https://www.cnblogs.com/xinyebs/archive/2013/06/04/3116574.html

static void QueryOverInts()
        {
            int[] numbers = new int[] { 10, 20, 30, 40, 1, 2, 3, 8 };

            //获取偶数
            var subset = from q in numbers
                         where q % 2 == 0
                         select q;

            //linq语句在这个地方执行,前面的from语句没有真正的运算,这叫做的linq的延迟执行,
            //利用这个,我们可以为相同的容器执行多次应用相同的ling查询。
            foreach (var i in subset)
            {
                Console.WriteLine(i);
            }

            Console.WriteLine("\n*****************************\n");
            //修改数组中的一些数据,按照最新的numbers数组来重新获取值
            numbers[0] = 4;

            foreach (var j in subset)
                Console.WriteLine(j);

            Console.WriteLine("\n*****************************\n");

            //立即执行,生成lstInt新的数据执行后和number这个数组没有关系了
            List<int> lstInt = (from q in numbers where q % 2 == 0 select q).ToList();
            number[0] = 100;
            foreach(int i in lstInt)
            {
                Console.WriteLine(i);
            }
            Console.ReadKey();
        }
10
20
30
40
2
8

*****************************

4
20
30
40
2
8

*****************************

4
20
30
40
2
8

 2、查看延迟执行是如何实现的

引自:《深入理解C#_第三版》

var adultNames = from person in people where person.Age >= 18 select person.Name;

foreach( var item in adultNames)
{

}

2.1

2.2

2.3 

显示在图11-1中的查询表达式被创建的时候,不会处理任何数据,也不会访问原始的人员列 表也未被访问。而是在内存中生成了这个查询的表现形式。

在最终结果的第一个元素被访问的时候,Select转换才会 为它的第一个元素调用Where转换。而Where转换会访问列表中的第一个元素,检查这个谓词是 否匹配(在这个例子中,是匹配的),并把这个元素返回给Select。最后,依次提取出名称作为 结果返回。

通常是IEnumerable或IQueryable使用延迟执行,返回单一值的运算使用立即执行。

而ToList ToDictionary ToArray等是立即使用了,所以返回值是单一值的列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值