一、揭开linq的神秘面纱 (一)概述
LINQ的全称是Language Integrated Query,中文译成“语言集成盘问”。LINQ作为一种盘问技术,首先要解决数据源的封装,大抵使用了三大组件来实现这个封装,分袂是LINQ to Object、LINQ to ADO.NET、LINQ to XML。它们和.NET语言的关系如下:
要使用LINQ来编程,首先要学习使用LINQ的子句以及由盘问语法组成的盘问表达式。C#3.0和VB9开始将这种盘问语法引入到了编程语言,并新增了一系列的关键字。但对付CLR自己来说,它并不了解盘问语法,它能理解的是由编程语言的编译器将这种盘问语法转换成的要领。这些要领叫“标准盘问运算符”,它们具有类似这样的名称——Where、Select、GroupBy、Join。下面就以C#为例,从编程语言的层面来具体介绍这些盘问语法(注意VB9也撑持这种盘问语法)。
LINQ的盘问由3根基部分构成:获取数据源,创建盘问,执行盘问。
// 1,获取数据源 List<int> numbers = new List<int>() { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; // 2,创建盘问 var numQuery = from num in numbers where num % 2 == 0 select num; // 3,执行盘问 foreach (var num in numQuery) { Console.WriteLine("{0,1}", num); }
下图显示了完整的盘问操纵。在 LINQ 中,盘问的执行与盘问自己截然差别;换句话说,如果只是创建盘问变量,则不会检索任何数据。
如上例所示,Linq的数据源要求必需实现IEnumerable或IEnumerable<T>接口,数组隐式撑持这个接口。numQuery叫做盘问变量,它存储了一个盘问表达式。注意,声明盘问变量并不会执行盘问,真正的执行盘问延迟到了foreach语句中。
(二)与LINQ有关的语言特性
1.隐式类型
(1)源起
在隐式类型呈现之前,我们在声明一个变量的时候,总是要为一个变量指定他的类型,甚至在foreach一个调集的时候,也要为遍历的调集的元素,指定变量的类型隐式类型的呈现,措施员就不用再做这个事情了。
(2)使用要领
来看下面的代码:
var a = 1; //int a = 1; var b = "123";//string b = "123"; var myObj = new MyObj();//MyObj myObj = new MyObj()
上面的每行代码,与每行代码后面的注释,起到的感化是完全一样的
也就是说,在声明一个变量(并且同时给它赋值)的时候,完全不用指定变量的类型,只要一个var就解决问题了
(3)你担忧这样写会降低性能吗?
我可以卖力任的报告你,这样写不会影响性能!上面的代码和注释里的代码,编译后孕育产生的IL代码(中间语言代码)是完全一样(编译器按照变量的值,推导出变量的类型,才孕育产生的IL代码)
(4)这个关键字的好处:
你不用在声明一个变量并给这个变量赋值的时候,写两次变量类型
(这一点真的为开发者节省了很多时间)
在foreach一个调集的时候,可以使用var关键字来取代书写循环变量的类型
(5)注意事项
你不能用var关键字声明一个变量而不给它赋值
因为编译器无法推导出你这个变量是什么类型的。
2.匿名类型
(1) 源起
创建一个东西,必然要先界说这个东西的类型吗?不必然的!
来看看这段代码
(2) 使用