哪位高人指点一下,C#中两个动态lambda表达式 表达式有什么办法合并成一个? 谢谢!

C#中 Lambda表达式 与正则表达式的关系_百度知道
C#中 Lambda表达式 与正则表达式的关系
有点混淆,Lambda表示式就是正则表达式还是二者没有任何关联?
提问者采纳
八竿子打不着的关系lambda表达式是函数式语言的特性,c#利用自身动态编译的特性才实现这种效果的,珐範粹既诔焕达唯惮沥可以用它写匿名函数等.像C,C++神马的都没有的.正则是各语言都有实现的,用来查询匹配等的
提问者评价
Thanks!了解清楚,总是混淆这两个
其他类似问题
lambda表达式的相关知识
其他2条回答
C#中 Lambda表达式 与正则表达式的关系 色。。珐範粹既诔焕达唯惮沥图片。。。色。。。小说很精彩。。论。。坛。。。在。。。线...电。。影UDP。。UOP 9q
=& 是 Lambda 运算符 ,该运算符读为“goes to”。该 Lambda 运算符的左边是输入参数(如果有),右边包含表达式或语句块。d 是由 lambda表达式自动推断出来的,在这里d 就是一个Dinner实体啊
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您所在的位置: &
解析C#委托、时间和Lambda表达式
解析C#委托、时间和Lambda表达式
IY专家网博客
.NET 中的委托确实和C/C++的函数指针非常相似。它是一个值类型,它包装了一个指向方法的引用。来看本文,希望对你有帮助。
.NET 中的委托确实和C/C++的函数指针非常相似。它是一个值类型,它包装了一个指向方法的引用。它的作用也是为了能够将方法和变量一样作为参数传递。委托的典型应用是控件的事件处理方法。很显然,一个控件在设计的时候没有办法知道当特定事件发生的时候,需要什么方法来处理,这就需要将方法作为参数传递给控件。在LINQ中,也大量用到了委托。
声明一个委托要使用delegate关键字,如下:
delegate int Echo(string message);这句代码声明了一个委托类型,这个委托类型的实例可以接受参数为string,返回值为int型的函数。这个方法可以是对象的方法,也可以静态方法,还可以是匿名方法,只要方法的签名和返回值是和声明一致的。这和C的函数指针很像,但是函数指针仅仅包含函数入口地址,而委托是一个类型,它具有比函数指针更强的功能。
其中一点就是当方法是实例方法的时候,这个方法可以获得对象的其他变量的值,文首的第二篇文章对此有详细介绍,不再赘述。第二点就是委托是支持多播的,也就是一串方法可以可以依次被执行。例如:
以下是代码片段:
static&int&EchoOriginal(string&message)& &{&Console.WriteLine(message);& &return&1;&}& &static&int&EchoReverse(string&message)& &{& &StringBuilder&sb=new&StringBuilder();& &for(int&i=message.Length-1;i&=0;i--)& &sb.Append(message[i]);& &Console.WriteLine(sb.ToString());& &return&-1;&}& &static&void&Main(string[]&args)& &{& &Echo&eo&=&EchoO& &Echo&er&=&EchoR& &Echo&all&=&eo&+&& &eo(&Hello&world&);& &int&i=all(&Hello&Delegate&);& &Console.WriteLine(i);& &}&
我们定义两个方法,这两个方法都符合Echo的声明,最后Echo的all实例可以接受两个委托,调用all的时候,eo,er会被一次钓鱼,返回值是最后一个委托的返回值。程序的输出是:
Hello world
Hello Delegat
etageleD olleH
事实上,方法并不需要和委托声明类型的签名完全一致,.net允许方法的返回值是继承自声明的返回值的类型,方法的参数类型是声明的参数的父类型。这就是Covariance and Contravariance in Delegates.
.NET的事件机制是以委托为基础的。事件机制有两部分组成,一部分是事件发布者,一部分是事件响应者。其实现原理就是由事件发布者声明一个委托对象,由事件响应者向那个委托挂载具体的处理方法,事件发布者在需要的时候调用这个委托,这样响应者的代码就会被执行。事实上,.NET也是这么做的。C#的event关键字就仅仅做了少量的工作,其中包括为类生成一个私有的delegate. event所支持的委托是有限制的委托,它的返回值必须是void,参数是两个,第一个是事件发生者,第二个参数是事件需要携带的参数。最简单的事件处理委托.net已经声明了:
以下是代码片段:
public&delegate&void&EventHandler(& &Object&sender,&EventArgs&e&)&
声明事件的基本方式是 event 委托类型 事件名称;举个例子,有这样的类,每当找到一个奇数,他就会触发一个事件。我们的程序在接到这个事件的时候在屏幕输出一个提示。类的代码可以这样实现:
以下是代码片段:
public&class&OddFinder&{& &public&event&EventHandler&FindO& &public&void&Find(int&from,&int&to)& &{& &for&(int&i&=&&i&&=&&i++)& &{& &if&(i&%&2&!=&0)&if&(FindOdd&!=&null)& &FindOdd(this,&EventArgs.Empty);& &}& &}& &}&
这个类很简单,展示了发起事件的基本方法。首先声明一个事件,指明这个事件处理函数的委托类型。在需要触发事件的时候,首先判断是否有事件处理函数挂载,然后调用这个委托即可。外部处理程序把事件处理程序挂载上去:
以下是代码片段:
static&void&Main(string[]&args)& &{& &OddFinder&f&=&new&OddFinder();& &f.FindOdd&+=&new&EventHandler(f_FindOdd);& &f.Find(1,&5);& &}& &static&void&f_FindOdd(object&sender,&EventArgs&e)& &{& &Console.WriteLine(&Found!&);& &}&
这样程序运行后,就会在屏幕上输出3次Found!。如果需要在触发事件的时候,传递更多的信息给事件处理函数,比如当前找到的奇数是多少,那么就需要新建一个类继承自EventArgs,在这个类中可以添加一些需要的数据。 再声明一个委托,第二个参数为EventArgs类型即可。
以上是基本的委托和事件的介绍,自.net 1.0开始就是如此,.net 2.0 引入了匿名方法,可以简化委托的某些操作。例如:
以下是代码片段:
f.FindOdd&+=&delegate(object&sender,&EventArgs&e)& &{& &Console.WriteLine(&Found!&);& &};&
匿名方法使用delegate关键字加上参数表,最后是代码块来定义。它可以作为委托赋值给委托类型。它可以省去单独定义一个方法的麻烦。
.NET 3.0之后引入了Lambda表达式,它进一步简化了匿名方法的写法,使得在C#中,把函数作为参数传递变得更加简单自然,从而C#变得更加具有函数式语言的味道。关于函数式语言的进一步介绍,可以参考:Functional Programming Languages . 函数式语言的理论基础是Lambda Calulus,关于此可以参考A Tutorial Introduction to the Lambda Calculus .
Lambda表达式本质上还是匿名方法,它的一般形式是:
(input parameters) =& expression左侧是参数列表,=&右侧是方法体,可以是一个表达式(expression lambda),也可以是大括号括起来的语句段(statement lambda)。它省略了delegate关键字,使得代码更加紧凑。例如:
n=&n%2==0;&
delegate(int&n){&return&n%2==0;}&
expression lambda 广泛应用于LINQ,它可以用来构造Expression Tree,Expression Tree是LINQ的基础。可以通过动态构造Expression Tree来实现复杂的动态LINQ查询,不过这种方法虽然通用,对于数据库查询,使用起来和传统的拼接字符串相比还是很麻烦。
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
《C#开发Android应用实战――使用Mono for Android和.NET/C# 全
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
在过去的近十年的时间里,面向对象编程大行其道。以至
很久很久以前,冬天爱上了夏天,可是他们始终不能相见
流火过,金秋来,在学校开学之前的最后一周,终于凉快
本书依据最新版《网络工程师考试大纲》的考核要求,深入研究了历年网络工程师考试试题的命题风格和试题结构,对考查的知识点进行
51CTO旗下网站您现在的位置: &
详解C# Lambda表达式的动态生成(1)
详解C# Lambda表达式的动态生成(1)
  对于C# Lambda的理解我们在之前的文章中已经讲述过了,那么作为Delegate的进化使用,为了让代码简洁和优雅的呈现,C# Lambda表达式的使用功不可灭,那么依托外部条件如何动态构建C# Lambda表达式呢。下面让我们来具体的看看实施。
  或许你会奇怪这个需求是如何产生的…… 首先,Lambda 在 DLinq 中承担了以往 T-SQL 的部分角色;其次,在数据库设计中,我们往往需要依据外部未知的动态条件组合来查询数据。而问题在于作为一种静态语言,我们显然无法用动态语法或者拼接字符串的方法来创建一个Delegate/Lambda,那么如何达到类似的目的呢?CodeDom?Emit?或许最佳的选择是 System.Linq.Expressions.Expression。
  1、首先我们了解一个简单C# Lambda表达式的构成。    i&=&&i&&&5&
  在这个表达式中,"i" 被称为 Parameter,"i & 5" 是 Body。我们可以对 Body 进行更进一步的分解,那么 "i & 5" 分别包含参数(i)、操作符(&)以及一个常数(5)。所有这些通过特定顺序的组合,从而构建一个完整的 Lambda 表达式。
  2、我们通过一些例子,来学习如何动态构建C# Lambda表达式。
  动态构建C# Lambda表达式例子1    var&ints&=& &  new&int[]&{&1,&2,&3,&4,&5,&6,&7,&8,&9&}; &  &  &  &  &  var&parameter&=& &  Expression.Parameter(typeof(int),&"i"); &  &  &  var&constant&=& &  Expression.Constant(5); &  &  &  var&bin&=& &  Expression.GreaterThan(parameter,&constant); &  &  &  var&lambda&=& &  Expression.Lambda&Func&int,&bool&&(bin,&parameter); &  &  &  var&_r&=&ints.pile()); &
  在代码中设置断点,我们可以看到调试器中显示的表达式信息。
  .NET FX 3.5 中为 Lambda 新增了一些委托类型。
  (1) 用于处理无返回数据的 Action。    public&delegate&void& &  Action() &  public&delegate&void& &  Action&T&&(T&arg) &  public&delegate&void& &  Action&T1,&T2&&(T1&arg1,&T2&arg2) &  public&delegate&void& &  Action&T1,&T2,&T3&& &  (T1&arg1,&T2&arg2,&T3&arg3) &  public&delegate&void& &  Action&T1,&T2,&T3,&T4&& &  (T1&arg1,&T2&arg2,&T3&arg3,&T4&arg4)&
  (2) 用于处理带返回数据的 Func。    public&delegate&TResult& &  Func&TResult&&() &  public&delegate&TResult &  Func&T,&TResult&&(T&arg) &  public&delegate&TResult& &  Func&T1,&T2,&TResult&& &  (T1&arg1,&T2&arg2) &  public&delegate&TResult& &  Func&T1,&T2,&T3,&TResult&& &  (T1&arg1,&T2&arg2,&T3&arg3) &  public&delegate&TResult& &  Func&T1,&T2,&T3,&T4,&TResult&& &  (T1&arg1,&T2&arg2,&T3&arg3,&T4&arg4)&
  我们还可以进行更复杂的组合。
  动态构建C# Lambda表达式例子2    var&ints&=& &  new&int[]&{&1,&2,&3,&4,&5,&6,&7,&8,&9&}; &  &  ints.Where(i&=&&i&&&5&&&&i&&=&7); &  &&  &  &  var&parameter&=& &  Expression.Parameter(typeof(int),&"i"); &  &  &  var&con1&=& &  Expression.Constant(5); &  var&bin1&=& &  Expression.GreaterThan(parameter,&con1); &  &  &  var&con2&=& &  Expression.Constant(7); &  var&bin2&=& &  Expression.LessThanOrEqual(parameter,&con2); &  &  &  var&body&=& &  Expression.And(bin1,&bin2); &  &  &  var&lambda&=& &  Expression.Lambda&Func&int,&bool&&(body,&parameter); &  &  var&_r&=&ints.pile()); &
  在例子2中,我们对复杂的表达式进行了分解,并使用 And 完成多个表达式的组装,由此我们可以创建更加复杂的逻辑组合,比如例子3。
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&最新问答
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 linq lambda表达式 的文章

 

随机推荐