LINQ有很多值得学习的地方,这里我们主要介绍LINQ的一些强大功能,包括介绍System.LINQ程序集等方面。
LINQ,即Language Integrated Query。很多人熟悉SQL语言,用它来操作数据库非常方便。现在在C#3.0中也可以使用相同的语法来操作各种数据,包括数组,文件,数据库等。
下面看一个例子:
- class Program
- ...{
- static void Main(string[] args)
- ...{
- string[] names=...{"Everett", "Albert", "George", "Harris", "David" };
- var items=from name in names
- where name.Length>=6
- orderby name
- select name.ToUpper();
- foreach(var item in items)
- Console.WriteLine(item);
- }
- }
是不是对上面的from,where,orderby等单词很熟悉,我们可以很轻松的像查询数据库一样查询某些数组。其实上述表达式等价于下面这样的写法:
- var items=names.Where(name=>name.Length>=6).
OrderBy(name=>name).Select(name=>name.ToUpper());
那么我们为什么能在数组上应用这些方法呢,本来数组上没有这些方法啊?回忆一下我们原来说过的内容,扩展方法,对,我们在这里看到扩展方法的用武之地了。而且我们也看到了Lambda表达式的应用使得语句更加简洁,易懂。这些扩展方法定义在哪里呢?我们可以在System.LINQ程序集里面看到这样的定义:
- namespace System.LINQ ...{
- public static class Enumerable ...{
- public static IEnumerable<T> Where<T>(
- this IEnumerable<T> source, Func<T, bool> predicate) ...{
- foreach (T item in source)
- if (predicate(item)
- )
- yield return item;
- }
- }
- }
这里我们可以清晰的看到许多this关键字,这些正是扩展方法的标志。若果我们对Lambda表达式不是很熟悉的化,上面的LINQ语句还可以进一步转化成委托的形式。
- Func<string, bool> filter = delegate (string s) ...{return s.Length >=6;};
- Func<string, string> extract = delegate (string s) ...{return s; };
- Func<string, string> project = delegate (string s) ...{return s.ToUpper(); };
- var items = names.Where(filter) .OrderBy(extract) .Select(project);
有一个问题,我们会注意到items前面是用var做它的类型,那么有没有提出这样的疑问,这个var到底是什么类型呢?我们仔细看一下那个System.LINQ程序集,就会发现扩转方法返回的是IEnumerable
这一次只是简单的介绍一下LINQ,以后我们在具体的讲一些应用,不过从介绍中我们看到LINQ的一些强大功能。
【编辑推荐】