商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

C#3.0之LINQ

作者:kittyjie  2008-01-15

【IT168技术文档】
  LINQ,即Language Integrated Query。很多人熟悉SQL语言,用它来操作数据库非常方便。现在在C#3.0中也可以使用相同的语法来操作各种数据,包括数组,文件,数据库等。由于 LINQ的东西比较多,准备分三次讲,第一次主要介绍一下LINQ,第二次主要介绍用LINQ操作数据库,第三次主要介绍用LINQ操作XML,第四次主要介绍LINQ的一些函数应用。有时间在写一些关于LINQ的专题。

下面看一个例子,程序员就应该拿代码说话:
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<T>类型,一个泛型接口,没错var就是这个泛型接口。还有一个问题就是当names满足什么条件时,我们可以应用LINQ表达式进行查询。这一点还要从那个程序集上仔细观察。我们会发现有一个source参数,根据扩展方法的语法我们知道这个source参数就是调用了这个方法的对象。那么我们可以推断出这个对象要能转换成IEnumerable< T>。那什么类型可以成功转换呢?很显然只要实现了IEnumerable<T>这个泛型接口的类型都可以转换。譬如数组类型, List<T>,等等。当我们还可以自己定义类型只要实现了这个接口就可以用LINQ对这个类型进行操作

  这一次只是简单的介绍一下LINQ,以后我们在具体的讲一些应用,不过从介绍中我们看到LINQ的一些强大功能。
1
【内容导航】
第1页: 概述
©版权所有。未经许可,不得转载。
[责任编辑:nancy]
[an error occurred while processing this directive]