引自: 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等是立即使用了,所以返回值是单一值的列表。