|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Java欺骗了我们那么多年,如今的多核时代,我认为它气数已尽!<p>写在后面
实在在09年就已进修过LINQ了,并被她那幽美的语法所吸引,只是如今地点的公司还在利用VS2005在.Net2.0的框架上面的开辟,以是LINQ也好久没有效过了,比来看部门的同事对这个有些乐趣,以是盘算收拾点器材出来跟人人一同做个分享。
甚么是LINQ
LINQ是LanguageIntegratedQuery的简称,它是集成在.NET编程言语中的一种特征。已成为编程言语的一个构成部分,在编写程序时能够失掉很好的编译时语法反省,丰厚的元数据,智能感知、静态范例等强范例言语的优点。而且它同时还使得查询能够便利地对内存中的信息举行查询而不单单只是内部数据源。
LINQ包含LINQtoObjects,LINQtoSQL,LINQtoXML,LINQtoDataSet等,本篇从LINQtoObjects入手下手懂得LINQ的外相。
入手下手LINQ前你要晓得的
扩大办法
望文生义就是对现有类举行扩大的的办法,扩大办法能够在不修正现有类的情形下,为现有类增添大众的接口(不是C#中的interface)。
扩大办法实质上是一个静态办法,分歧的地方在于它的第一个参数必需有this关头字声明,而且第一个参数的范例即为要扩大的范例。如
<olclass="dp-c">publicstaticdoubleToDouble(thisstringsource){doubleres=0d;double.TryParse(source,outres);returnres;}publicstaticvoidSimpleExtesionMethod(){doubled="12345.54321".ToDouble();Console.WriteLine(d);}
这里是个复杂的将字符串转为double范例的扩大办法,只需援用了该办法的定名空间,则都能够间接用string范例来挪用ToDouble办法。
扩大办法是后文的基本,C#3.0中的LINQ的完成都是基于扩大办法,经由过程对IEnumerable<T>接口(LINQtoObjects)的扩大和对IQueryable<T>的扩大来完成LINQ的相干功效,而LINQ的相干关头字终极都是转化为对IEnumerable<T>(IQueryable<T>)的挪用。
Lambda表达式
lambda表达式实在就是就是.net2.0中的匿名办法,然后再3.0中以一种更幽美的姿势出现出来。
lambda表达式的基础语法为
(参数列表)=>{语句块;}大概
(参数列表)=>表达式
当参数列表中只要一个参数的时分,圆括号能够省略
<olclass="dp-c">Func<string,string>func=x=>x+x;Console.WriteLine(func("a"));
Var:隐式范例化变量
利用与能够由编译器推导出的变量的声明,不必要显式指定工具的范例。
<olclass="dp-c">varcontainer=newList<string>{"张三","李四","王五"};IEnumerable<string>query=fromnameincontainerselectname;
上例中因为界说中已指了然工具的范例,声明中已完整没有需要利用显现的范例界说,以是可使用var关头字。
关于匿名工具
<olclass="dp-c">vartest=new{Name="Sth.",Type="UnKnown"};
因为没法用一个范例类声明匿名工具,此时能够用var是声明。
注重var只是省下了显式声明的历程,而C#自己就是静态言语,以是var所声明的变量的范例已断定任然是不克不及改动的,亦即,var并不是是变体范例。
LINQ对谁合用
LINQ的语法经由过程System.LINQ上面的Enumerable类供应撑持,经由过程察看他的署名,你就会发明他为IEnumerable<T>完成了一系列的扩大办法,也就是说,只需是完成了IEnumerable<T>的工具都可使用LINQ的语法来查询。
而关于只完成了IEnumerable接口而没有完成IEnumerable<T>的工具能够经由过程
<olclass="dp-c">publicstaticIEnumerable<TResult>Cast<TResult>(thisIEnumerablesource);
来将IEnumerable接口转为IEnumerable<T>(比方ArrayList)。
LINQ中的关头字
在C#3.0中,为LINQ引进了一些新的关头字,他们是:
<olclass="dp-c">fromjoinwheregroupintoletorderbyselect
熟习Sql的同砚看着是否是有些眼生呢,实在在LINQ中他们的涵义和在SQL中相似的,以是会很简单了解的。接上去的工夫,复杂先容下这些关头字的利用。
from
from子句是一个LINQ查询的入手下手,任何一个LINQ语句都是以from入手下手,from子句指定查询的容器,和在此语句无效的部分变量(用来指定容器中的一项,from子句的效果很相似于foreach)。from子句的语法为
<olclass="dp-c">fromlocalincontainerlocal
就是在此LINQ语句中的部分变量,因为container必需为IEnumerable<T>,他的范例能够由container推导出来(即T)。上一段复杂的例子:
<olclass="dp-c">varcontainer=newList<string>{"张三","李四","王五"};varquery=fromnameincontainerselectname;foreach(stringnameinquery){Console.WriteLine(name);}
输入
张三
李四
王五
<p>假如container仅仅完成IEnumerable而没有完成IEnumerable<T>,则必要显式指定部分变量的范例,大概是使无论谁倒了对双方阵营的粉丝们也是有害无益。 |
|