C#3.0之LINQ(1)

翻译|其它|编辑:郝浩|2007-08-14 11:20:58.000|阅读 921 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

      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);
        }

    }

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

     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<stringbool> filter = delegate (string s) ...{return s.Length >=6;}

Func<
stringstring> extract = delegate (string s) ...{return s; }

Func<
stringstring> 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 的一些强大功能。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP