c#Lamdba表达式与委托


     “Lambda表达式”(lambda expression)是一个匿名函数,C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。

 

如何创建


格式:( 形参列表 ) => { 函数体 }

 

 

若要创建 Lambda表达式,需要在 Lambda运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。例如,lambda表达式 x => x * x指定名为 x的参数并返回 x的平方值。如下面的示例所示,你可以将此表达式分配给委托类型:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. delegate int del(int i);  
  2. static void Main(string[] args)  
  3. {  
  4.     del myDelegate = x => x *x;  
  5.     int j = myDelegate(5); //j = 25  
  6. }  

注意:函数体多于一条语句的可用大括号括起。

以上函数体也可以写成

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. del myDelegate = x => { return x * x;};  

使用 Lambda表达式


=> 运算符具有与赋值运算符 (=) 相同的优先级并且是右结合运算

仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。括号内的两个或更多输入参数使用逗号加以分隔:

(x,y) => x == y 


使用Lamdba语句

语句 lambda 与表达式 lambda 表达式类似,只是语句括在大括号中:

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. delegatevoid TestDelegate(string s);  
  2. …  
  3. TestDelegatemyDel = n => { string s = n + " " + "World";Console.WriteLine(s); };  
  4.    
  5. myDel("Hello");  


代码中如何利用Lamdba

 

Lambda 在基于方法的 LINQ 查询中用作标准查询运算符方法(如Where)的参数。参数是委托类型System.Func<T, TResult>。 使用 Lambda 表达式创建该委托最为方便 

看实例

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public delegate TResult Func<TArg0, TResult>(TArg0 arg0)  

可以将委托实例化为 Func<int,bool> myFunc,其中 int是输入参数,bool 是返回值。 返回值始终在最后一个类型参数中指定。 Func<int, string, bool>定义包含两个输入参数(int 和 string)且返回类型为 bool 的委托。 当调用下面的 Func 委托时,该委托将返回 true 或 false以指示输入参数是否等于 5:  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. Func<int,bool> myFunc = x => x == 5;  
  2. boolresult = myFunc(4); // returns false of course  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //项目中用到的一个小例子   
  2. public CommodityCollection Load(string type)  
  3.         {  
  4.    
  5.             return this.Load(p =>  
  6.             {  
  7.                 p.AppendItem("Code",type);  
  8.             });  
  9.         }  

return中的load方法实际上是一个具有泛型的委托,p为继承实现了SqlClauseBuilderUW的方法 

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. [Serializable]  
  2.     public abstract class SqlClauseBuilderUW : SqlClauseBuilderIUW  
  3.     {  
  4.         protected SqlClauseBuilderUW();  
  5.   
  6.         public SqlClauseBuilderUW AppendItem<T>(string dataField, T data, string op, string template);  
  7.         public SqlClauseBuilderUW AppendItem<T>(string dataField, T data, string op, string template, bool isExpression);  
  8.         protected override SqlClauseBuilderItemBase CreateBuilderItem();  
  9.     }  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public TCollection Load(Action<WhereSqlClauseBuilder> whereAction);  

[csharp]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. namespaceSystem  
  2. {  
  3. // 摘要:  
  4. //     封装一个方法,该方法只有一个参数并且不返回值。  
  5. //  
  6. // 参数:  
  7. //   obj:  
  8. //     此委托封装的方法的参数。  
  9. //  
  10. // 类型参数:  
  11. //   T:  
  12. //     此委托封装的方法的参数类型。  
  13. public delegate void Action<in T>(T obj);  
  14. }  

小结:


综合应用可以看出Lamdba可以简化查询的方法,并且在Linq的使用中多与泛型委托,枚举的where方法结合使用。是查询方式简化了很多,但是内部构造却与匿名函数相同的.也是刚刚接触了解,不足之处还请谅解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值