C# 2.0最大的改进是泛型.C# 3.0最大的改进就是Linq(语言集成查询).Linq又细分三大块:Linq to XML,Linq to ADO.NET(Linq to SQL,Linq to DataSet,Linq to Entity),Linq to Object.
关于Linq的争议
有些人对Linq to ADO.NET可能有很多异议.觉得它是对ADO.NET再封装一次,性能降低了 .而且ADO.NET用着也挺好的.干嘛那么麻烦再学个新技术Linq.其实编程语言中新增加的一些特性往往是为了更方便开发人员,提高开发效率,降低你犯错误的可能性.当然同时得也得考虑性能方面的事了.但是现在电脑硬件配置越来越好.以前的内存才那么几百M,现在动不动就几G,CPU性能也越来越好.所以有时别太为电脑去考虑.多为程序员考虑下.怎么少写点代码实现更多的功能.至于那些简单的代码后面再要执行啥复杂的操作也不用考虑太多.像托管代码不就是替你做了很多事,比如不用去考虑啥内存泄露这样的烦心事了嘛.中间多了个CLR性能自然下降了.但你写起代码来多省事了啊.
当然了如果你觉得Linq性能不好也可以完全不用,它实现的功能采取其他方法也照样能实现.只不过多写些代码罢了.
简单例子
先举几个关于Linq to Object简单例子来大概介绍下Linq的语法.看具体怎么用.
string[] names = { "arwen", "james", "sunny", "lily", "ada" };
var name = from na in names
select na;
foreach (var str in name)
{
string s = str;
Console.WriteLine(s);
}
分析:
首先说下关键字var,它是用来做类型推断,也就是说它可以用来代替string,int等所有关键字来定义一个类型.然后编译器可编译时可以通过变量的值推断出变量类型.
其实在这里你也可以用IEnumerable<string> name 来代替var name这样定义变量.
然后就是from,select这样的关键字了.看起来很像SQL语句的语法吧.Linq的设计应该就是参照了SQL的思想吧.sql语句就是封装了很多细节,只告诉计算机去做什么,而不用告诉他具体怎么做.而我们平时用C#,Jave,C++这些语言都不仅要告诉计算机去做什么,还要怎么做.把具体的每一步用代码写出来.以上面的例子来说.如果我们要获取数组中以a开头的元素.如果没用Linq你必须这样写代码去判断
List<string> list = new List<string>();
foreach(string s in names)
{
if(s.StartWith("a")
list.Add(s);
}
就是说要自己指定计算机去具体怎么做.但如果用Linq的话就直接用下面的语句
var name = from na in names
where na.StartsWith("a")
select na;
用一个where去告诉计算机做什么就行.具体怎么做就不用管了.
所以Linq的真正的意义不仅是使你的一些操作更简单,而且引进了SQL语句那种思想.尽量封装一些具体操作细节,把注意力放在软件要实现的功能方面.当然SQL语句应用范围也是有限,只能针对表的一些简单操作,更复杂的操作还需要一些扩充,比如SQL Server有T-SQL,Oracle有PL/SQL,面对一些复杂的操作它们还得写很多代码去告诉计算机具体怎么做.
Linq也同样有局限的.查询语言,顾名思议只能查询数据.所以我们只能从数组names中获取数据,而不能通过Linq去修饰里面的数据.
Linq很多用法跟SQL类似,所以可以参照SQL那些关键字用法学下.当然Linq还有其他一些更复杂的操作.再举个简单例子说下把获得的数据排序
string[] names = { "arwen", "james", "sunny", "lily", "ada" };
var name = from na in names
orderby na descending
select na;