编译器也不会提示你 3扩展方法太强大了

时间:2021-08-17 06:51:51

一、揭开linq的神秘面纱 (一)概述

    LINQ的全称是Language Integrated Query,中文译成“语言集成盘问”。LINQ作为一种盘问技术,首先要解决数据源的封装,大抵使用了三大组件来实现这个封装,分袂是LINQ to Object、LINQ to ADO.NET、LINQ to XML。它们和.NET语言的关系如下:

 

编译器也不会提示你 3扩展方法太强大了

    要使用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 中,盘问的执行与盘问自己截然差别;换句话说,如果只是创建盘问变量,则不会检索任何数据。

编译器也不会提示你 3扩展方法太强大了

如上例所示,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) 使用