Lambda说法——(一)追究

简介: 在2.0之前的版本中,如果要声明委托,要通过命名方法来实现。而2.0开始引入了匿名方法,在3.0及更高版本中,提供了lambda来取代匿名方法,作为编写内联代码的首选方式。   (一)通过命名方法来声明委托 delegate void PrintName(string strName);...

2.0之前的版本中,如果要声明委托,要通过命名方法来实现。而2.0开始引入了匿名方法,在3.0及更高版本中,提供了lambda来取代匿名方法,作为编写内联代码的首选方式。

 

(一)通过命名方法来声明委托

delegate   void  PrintName( string  strName);
public   void  NomalDelegate()
{
    PrintName pp 
=  ShowName; 
    pp(
" John " );


public   void  ShowName( string  strName)
{
    Console.WriteLine(
" Hello, " + strName);
}

 

声名委托,不返回值,带有一个串型参数。创建ShowName方法的委托对象pp,通过pp来代理ShowName方法的全部功能。

这是在2.0之前版本中支持。

(二)通过匿名方法来声明委托

delegate   void  PrintName( string  strName);
public   void  AnonymousDelegate()
{
   PrintName pp 
=   delegate ( string  strName)
   {
       Console.WriteLine(
" Hello, "   +  strName);
   }; 

   pp(
" John " );
}

 

这里省略了ShowName方法,通过匿名方法对这个方法做了抽象,使这个方法没有了意义,但执行相同的功能。

匿名方法提供一种内联代码编写的首选方式。因为是内联的,所以,这里要添加分号,来做了一个表达式的结束。

2.0中,开始增加了对匿名方法的支持。

(三)通过lambda表达式来创建委托

public   void  LambdaDelegate()
{
    PrintName pp 
=  strName  =>  Console.WriteLine( " Hello, "   +  strName);
    pp(
" John " );
}

 

比较一下匿名方法与lambda表达式。

PrintName p1  =   delegate ( string  strName){Console.WriteLine( " Hello, "   +  strName);};

PrintName p2 
=                  strName  =>  Console.WriteLine( " Hello, "   +  strName);

 

匿名方法参数由lambda左边参数列表指定,代码段{}隐藏(对于多条语句的,要添加{},如(a, b) => { Console.WriteLine(a); Console.WriteLine(b); };)。goesto(=>)可以理解为分隔符,用于区分方法参数与方法体。而参数类型string因为匿名类型的原因隐藏(当然,也可以用强类型来指定类型,但须加(),例如(string strName))。对于单参数,()可以省略;对于多个参数,要添加(),如(a,b);对于零个参数,也要添加(),如()。

(四)Lambda表达式解读

(1)x=>x==5

这个表达式实相当于方法

bool  XXX( int  x)
{
    
if (x == 5 ) return   true ;
        
return   false ;
}

 

它用于返回bool型值。但这个表达是一个委托类型。通过Func<>方法委托来实现。如下:

Func < int bool >  fun  =  x  =>  x  ==   5 ;
bool  bSign = fun( 5 );

 

(2)n => n % 2 == 1

这个部分取自以下场景:

int [] numbers  =  {  5 4 1 3 9 8 6 7 2 0  };
int  oddNumbers  =  numbers.Count(n  =>  n  %   2   ==   1 );

 

通过以上场景判断,n % 2 == 1相当于:

bool  XXX( int  n)
{
    
if  (n  %   2   ==   1 return   true ;
        
return   false ;
}

 

通过Func委托方法实现:

Func < int bool >  fun  =  n  =>  n  %   2   ==   1 ;

 

Count 方法有两个重载:

 

public   static   int  Count < TSource > ( this  IEnumerable < TSource >  source)
public   static   int  Count < TSource > ( this  IEnumerable < TSource >  source,Func < TSource,  bool >  predicate)

 

这种方法叫做扩展方法。而这个场景应用的就是第二个扩展方法,就是实现IEnumerable泛型接口的数组,来统计用来满足条件n % 2 == 1的元素的个数,而这个参数就是一个Func<TSource, bool>类型的委托实例,就是我们的:

Func < int bool >  fun  =  n  =>  n  %   2   ==   1 ;

 

也就是查找奇数的个数。

(3)n => n < 6

numbers.TakeWhile(n  =>  n  <   6 );

 

还是这个场景:

int [] numbers  =  {  5 4 1 3 9 8 6 7 2 0  };
var firstNumbersLessThan6 
=  numbers.TakeWhile(n  =>  n  <   6 );

 

通过场景分析,可以得到n=>n<6的命名方法:

bool  XXX( int  n)
{
   
if  (n < 6 return   true ;
     
return   false ;
}

 

通过Func委托实现:

Func < int bool >  fun  =  n  =>  n < 6 ;

 

TakeWhile方法也是扩展方法:

public   static  IEnumerable < TSource >  TakeWhile < TSource > ( this  IEnumerable < TSource >  source,
    Func
< TSource,  bool >  predicate
)

public   static  IEnumerable < TSource >  TakeWhile < TSource > ( this  IEnumerable < TSource >  source,
    Func
< TSource,  int bool >  predicate

)

 

而我们用到的就是第一个,它的功能定义为:只要满足指定的条件,就会返回序列的元素,然后跳过剩余的元素。

所以它返回的是一个Ienumerable泛型接口的泛型集。而上一个例子中的Count返回的则是一个int值。

foreach  ( int  i  in  firstNumbersLessThan6)
    Console.WriteLine(i);

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
存储 消息中间件 监控
一文搞懂常见的网络I/O模型
一文搞懂常见的网络I/O模型
338 0
|
人工智能 自然语言处理 异构计算
Stability AI发布基于稳定扩散的音频生成模型Stable Audio
近日Stability AI推出了一款名为Stable Audio的尖端生成模型,该模型可以根据用户提供的文本提示来创建音乐。
388 1
|
消息中间件 存储 缓存
【Kafka】(十)Kafka 如何实现高吞吐量
【Kafka】(十)Kafka 如何实现高吞吐量
939 0
|
消息中间件 Kubernetes Cloud Native
云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator
RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区。本文将从实践出发,结合案例来说明,如何通过 RocketMQ Operator 在 Kubernetes 上快速搭建一个 RocketMQ 集群,并提供一些 RocketMQ 集群管理功能包括 Broker 扩容等。
云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator
|
人工智能 测试技术 API
ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级
ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级
ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级
|
8月前
|
人工智能 自然语言处理 算法
深度:DeepSeek会取代文学创作吗?
本文探讨了DeepSeek等人工智能工具对文学创作的影响。尽管AI在文本生成方面展现出惊人能力,但它难以取代文学创作的核心要素,如情感、创造性和复杂叙事能力。文章指出,AI既是挑战也是机遇,文学创作者可借助GAI认证等手段提升技能,与AI协作,构建新的文学生态,在AI时代实现自我突破与发展。
|
8月前
|
存储 缓存 弹性计算
聚宽揭秘:为什么量化研究员喜欢在Kubernetes上使用Fluid简化数据管理?
在量化投研过程中,通过引入阿里云的 ack-fluid 技术,基于 JindoRuntime 的分布式缓存加速,解决了多数据源、弹性扩展、动态挂载等挑战,显著提升了数据处理效率和资源利用率,降低运营成本。
|
9月前
|
移动开发 前端开发 UED
React 音频预览组件 Audio Preview
在现代Web开发中,React框架下的音频播放功能日益重要。本文介绍如何使用React创建交互式音频预览组件,涵盖基础构建、常见问题及解决方案。通过HTML5音频标签实现基本播放控制,使用状态管理增强功能。解决跨域资源共享(CORS)、格式兼容性、自动播放限制等问题,并探讨性能优化、样式定制、事件处理、移动端适配、错误处理、国际化支持及组件集成等关键点,帮助开发者提升组件稳定性和用户体验。
172 10
|
前端开发 JavaScript 搜索推荐
打造个人博客网站:从零开始的HTML和CSS之旅
【9月更文挑战第32天】在这个数字化的时代,拥有一个个人博客不仅是展示自我的平台,也是技术交流的桥梁。本文将引导初学者理解并实现一个简单的个人博客网站的搭建,涵盖HTML的基础结构、CSS样式的美化技巧以及如何将两者结合来制作一个完整的网页。通过这篇文章,你将学会如何从零开始构建自己的网络空间,并在互联网世界留下你的足迹。
|
SQL 数据库
INTO SELECT
【11月更文挑战第10天】
348 3