详解详解LINQ入门(中篇)入门(中篇)
前前 言言
在上篇中简单的分享了LINQ的基础概念及基础语法,如果没有阅读过上篇的朋友可以点击这里。感谢大家的支持,本篇我们
将更进一步的学习LINQ的一些相关特性及应用方法。废话不多说,请往下阅读吧。
延迟加载延迟加载
在上篇中简单的和大家提到了LINQ具有一个很有意思的特性那就是“延迟加载”(或“延迟计算”),什么是延迟加载呢?先看来
自官方的描述:延迟执行意味着表达式的计算延迟,直到真正需要它的实现值为止。是不是觉得有点生涩难理解呢?按照我个
人的理解通俗的讲就是,每当我们编写好一段LINQ表达式时,此时这个表达式所代表的序列变量仅仅只是一个代理,编译器
在执行编译时根本就不鸟这段代码,检查完语法正确性后直接跳过,直到代码在编译器动态运行序列变量在其他代码块被调用
时,它所代理的linq表达式才会执行。啊~~看到这里你是不是要晕了,到底要怎么理解啊,无废话上代码:
// 已知一个序列
var array = new int[] {1, 2, 3};
// 编写一段LINQ表达式获得一个序列变量query
// 注意,这个变量仅仅是一个代理,在执行编译的时候,编译器检查完
// 该代码的正确性后直接跳过,不再理会
var query = from arr in array
where arr > 1
select arr;
// 调用上述序列变量query,此时上述的LINQ表达才会执行。注意此时已是在
// 编译器Runtime 的情况下执行
foreach(var q in query)
Console.WriteLine(q.ToString());
如果你觉得上述例子不能让你有个深刻的理解,那么请看来自MSDN的例子
public static class LocalExtensions
{
public static IEnumerable<string>
ConvertCollectionToUpperCase(this IEnumerable<string> source)
{
foreach (string str in source)
{
Console.WriteLine("ToUpper: source {0}", str);
yield return str.ToUpper();
}
}
}
class Program
{
static void Main(string[] args)
{
string[] stringArray = { "abc", "def", "ghi" };
// 这里方法 ConvertCollectionToUpperCase 是不会在编译时进行调用核查的,直到下面的foreach调用变量 q 此方法才会执行
var q = from str in stringArray.ConvertCollectionToUpperCase()
select str;
foreach (string str in q)
Console.WriteLine("Main: str {0}", str);
}
}
注意,ConvertCollectionToUpperCase 是一个静态扩展方法,后续讲解,如果你对.net 2.0 的 yeild 不熟悉的网上查阅吧,这
里就不做介绍了。
// 输出结果
// ToUpper: source abc
// Main: str ABC
// ToUpper: source def