Linq 有很多值得学习的地方,这里我们主要介绍Linq foreach语句,包括介绍foreach循环来强制执行查询等方面。
实际的查询执行会延迟到在Linq foreach语句中循环访问查询变量时发生。此概念称为“延迟执行”,下面的示例对此进行了演示:
- //Query execution.
- foreach (int num in numQuery)
- {
- Console.Write("{0,1} ", num);
- }
Linq foreach语句也是检索查询结果的地方。例如,在上一个查询中,迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)。
由于查询变量本身从不保存查询结果,因此可以根据需要随意执行查询。例如,可以通过一个单独的应用程序持续更新数据库。在应用程序中,可以创建一个检索***数据的查询,并可以按某一时间间隔反复执行该查询以便每次检索不同的结果。
对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。Count、Max、Average 和 First 就属于此类查询。由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式Linq foreach语句。另外还要注意,这些类型的查询返回单个值,而不是 IEnumerable 集合。下面的查询返回源数组中偶数的计数:
- var evenNumQuery =
- from num in numbers
- where (num % 2) == 0
- select num;
- int evenNumCount = evenNumQuery.Count();
若要强制立即执行任意查询并缓存其结果,可以调用 ToList<(Of <(TSource>)>) 或 ToArray<(Of <(TSource>)>) 方法。
- List<int> numQuery2 =
- (from num in numbers
- where (num % 2) == 0
- select num).ToList();
- //or like this:
- //numQuery3 is still an int[]
- var numQuery3 =
- (from num in numbers
- where (num % 2) == 0
- select num).ToArray();
此外,还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。但是,通过调用 ToList 或 ToArray,也可以将所有数据缓存在单个集合对象中。
【编辑推荐】