介绍LINQ一些强大功能

开发 后端
这里介绍LINQ,即Language Integrated Query。很多人熟悉SQL语言,用它来操作数据库非常方便。现在在C#3.0中也可以使用相同的语法来操作各种数据,包括数组,文件,数据库等。

LINQ有很多值得学习的地方,这里我们主要介绍LINQ,包括介绍Lambda表达式的应用使得语句更加简洁,易懂等方面。

LINQ,即Language Integrated Query。很多人熟悉SQL语言,用它来操作数据库非常方便。现在在C#3.0中也可以使用相同的语法来操作各种数据,包括数组,文件,数据库等。由于LINQ的东西比较多,本文主要介绍LINQ。

下面看一个例子,程序员就应该拿代码说话:

  1. class Program  
  2. ...{  
  3. static void Main(string[] args)  
  4. ...{  
  5. string[] names=...{"Everett", "Albert", "George", "Harris", "David" };  
  6. var items=from name in names  
  7. where name.Length>=6  
  8. orderby name  
  9. select name.ToUpper();  
  10. foreach(var item in items)  
  11. Console.WriteLine(item);  
  12. }  

是不是对上面的from,where,orderby等单词很熟悉,我们可以很轻松的像查询数据库一样查询某些数组。其实上述表达式等价于下面这样的写法:

  1. var items=names.Where(name=>name.Length>=6).
    OrderBy(
    name=>name).Select(name=>name.ToUpper());  

那么我们为什么能在数组上应用这些方法呢,本来数组上没有这些方法啊?回忆一下我们原来说过的内容,扩展方法,对,我们在这里看到扩展方法的用武之地了。而且我们也看到了Lambda表达式的应用使得语句更加简洁,易懂。这些扩展方法定义在哪里呢?我们可以在System.LINQ这个程序集里面看到这样的定义:

  1. namespace System.LINQ ...{   
  2. public static class Enumerable ...{   
  3. public static IEnumerable<T> Where<T>(   
  4. this IEnumerable<T> source, Func<T, bool> predicate) ...{   
  5.  
  6. foreach (T item in source)   
  7. if (predicate(item)  
  8. }  
  9. yield return item;   
  10. }  
  11. }  

这里我们可以清晰的看到许多this关键字,这些正是扩展方法的标志。若果我们对Lambda表达式不是很熟悉的化,上面的LINQ语句还可以进一步转化成委托的形式。

  1. Func<string, bool> filter = delegate (string s) ...{return s.Length >=6;};   
  2. Func<string, string> extract = delegate (string s) ...{return s; };   
  3. Func<string, string> project = delegate (string s) ...{return s.ToUpper(); };   
  4. 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. LINQ to SQL Table浅谈
  2. Linq语句问题的解决方法
  3. Ling to sql更新实体概述
  4. Linq实体继承简单描述
  5. Linq Library概述
责任编辑:佚名 来源: 51cto.com
相关推荐

2009-09-08 10:35:24

LINQ技术

2010-03-04 13:36:55

openSUSE

2010-06-23 16:42:33

2010-03-26 13:39:28

Python标准库

2010-01-22 17:48:46

VB.NET运算符重载

2018-02-23 13:25:49

LinuxVim编辑器

2010-03-26 10:05:22

Python嵌入CC++

2010-04-07 16:55:14

Unix命令

2010-08-13 16:10:11

FlexCSS

2009-08-26 18:15:39

ibmdwFlex

2010-08-06 14:23:25

FlexCSS

2010-09-17 12:39:51

JAVA反射机制

2009-12-24 11:13:21

2010-03-19 09:34:42

Cisco 2600模

2019-10-15 06:00:26

Google AnalAngularReact

2011-05-23 18:06:24

站内优化SEO

2010-03-24 18:27:27

无线mesh网络应用

2010-04-27 17:58:17

Oracle 9i

2022-05-24 12:50:58

Pandas索引代码

2009-06-18 10:53:52

Hibernate3.
点赞
收藏

51CTO技术栈公众号