快速业务通道

LINQ体验(3)——C# 3.0新语言特性和改进(下篇)

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-21
合的框架层扩展。

扩展方法要点

扩展方法的本质为将实例方法调用在编译期改变为静态 类中的静态方法调用。事实上,它确实拥有静态方法所具有的所有功能。

扩展方法的作用域是整个namespace可见的,并且可以通过using namespace来导入其它命名空间中的扩展方法。

扩展方法的优先级:现有 实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为 较远的namespace下的静态类的静态方法。

扩展方法是一种编译时技术, 注意与反射等运行时技术进行区别,并慎重使用。

Lambda表达式和 Lambda表达式树 (Lambda Expression and Lambda Expression Trees)Lambda表 达式

我们从“所有字符串查找包含YJingLee子字符串”说起。在 C# 2.0中,匿名方法允许我们以内联的方式来实现委托实例,它提供强大的函数 式编程语言,但是标记显得相当的冗长和带有强制性。我们使用C# 2.0 中的匿 名方法查找,代码如下:

var inString = list.FindAll (delegate(string s)
{ return s.Indexof("YJingLee") >= 0; });

现在可以使用C# 3.0带来的Lambda表达式允许我们使用 一种更接近人的思维、更自然的方式来实现类似于匿名方法同样的效果,看下面 的代码多么简洁:

var inString = list.FindAll(s => s.Indexof("YJingLee") >= 0);

Lambda表达式格式:( 参数列表)=>表达式或语句块

具体意义:定义Lambda接受参数列表, 运行表达式或语句块返回表达式或语句块的值传给这个参数列表。

Lambda表达式参数类型可以是隐式类型或显式类型。在显式列表中,每 个参数的类型是显式指定的,在隐式列表中,参数的类型由Lambda表达式出现的 语境自动推断类型。

Lambda表达式的参数列表可以有一个或多个参数, 或者无参数。在有单一的隐型参数的lambda表达式中,圆括号可以从参数列表中 省略。

例如:

(x, y) => x * y;//多参数,隐式类型 =>表达式
x => x * 10;//单参数,隐式类型=>表达式
x => { return x * 10; }; //单参数,隐式类型=>语句块
(int x) => x * 10;//单参数,显式类型=>表达式
(int x) => { return x * 10; };//单参数,显式类型=>语句块
() => Console.WriteLine(); //无参数

下面看这个例子:

在前面的 帖子中,我们写了一个User类及增加了2个人,接下来,我们使用由LINQ提供的 新的Where和Average方法来返回集合中的人的一个子集,以及计算这个集合中的 人的平均年龄:

List<User> user = new List<User>{
  new User {Id=1,Name="YJingLee",Age=22},
  new User {Id=2,Name="XieQing",Age=25},
};
//获取特定人时所 用的过滤条件,p参数属于User类型
var results = user.Where(p => p.Name == "YJingLee").ToList();
//用User对象的Age值计算 平均年龄
var average = user.Average(p => p.Age);

效果 图如下:

LINQ体验(3)——C# 3.0新语言特性和改进(下篇)

对这个Lambda表达式做个简要分析:

var resultsdelegate = user.Where(delegate(User p)
{
  return p.Name == "YJingLee";// 返回一个布尔值
});
var averagedelegate = user.Average(delegate(User p)
{
  return p.Age;
});

LINQ体验(3)——C# 3.0新语言特性和改进(下篇)

Lambda表达式L可以被转换为委托类型D,需要满足以下条件:

L的参数类型要与D的参数个数相等,类型相同,返回类型相同,无论是 表达式,还是语句块。注意隐式类型要参与类型辨析。

Lambda表达式树

Lambda表达式树允许我们像处理数据(比如读取,修改)一样来处理Lambda 表达式。我以一个例子简单说明:

Expression<Func<int, bool>> filter = n => (n * 3) < 5;
BinaryExpression lt = (BinaryExpression)filter.Body;

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号