【翻译】Lambda表达式学习

时间:2021-07-12 19:10:06

摘要

在这篇文章中,Brian讨论了Lambda表达式 在.NET应用程序中的Lambda的用法和应用。
提供了一个简短的介绍,在源代码和相关说明帮助下他测试了概念

介绍

Lambda表达式减少了重复数据的工作量。所有可列举数据是通过使用一个SQL-like
查询语法(一种看起来像SQL的查询,但不同于它)的LINQ来查询的。
LINQ 内置机制将循环枚举数据,并且使用一定的条件构成条件语句过滤数据。LINQ查询效率非常高。
Lambda表达式也是以类似的方式工作。一些现有的扩展方法内嵌Lamdba表达式来执行某些操作,
并且使重复操作变得更容易。我们将很快看到。Lambda表达式能够不需要扩展方法,但是这是现在通常的用法。

.NET Framework Lambda's

在.NET Framework 使用Lambda表达式可以定义各种各样扩展方法。在System.Core程序集,
System.Linq命名空间提供了两个静态类包含各种各样枚举和查询的定义源码。
例如在一些Where方法中定义了那些表达式。像这样的方法定义:

Listing 1

【翻译】Lambda表达式学习Where < TSource > (IEnumerable < TSource > , Func < TSource,  bool > );

请注意第二个参数;Func (or function in VB.NET)定义了一个Lambda表达式。泛型参数是个key。
在Lambda表达式中第一个参数是IEnumerable接口类型,并且第二个参数是必须被方法返回的值。
我马上会开始一个例子,但意识到返回值的类型有许多例如一个string,double,业务实体,等。
那么我们使用Lambda表达式?在C#中Lambda表达式定义如下:

Listing 2

【翻译】Lambda表达式学习var items  =  list.Where(I  =>  I.FirstName  ==   " Fred " );

让我们继续这里。首先,"=>"代码标记一个Lambda表达式。"I" 参数是如上面的Func所声明的
类型<TSource> 别名或对象名。第一个参数是对象被循环,或者在容器中许多项的项类型。
例如,如果你有一个List<MyObject>,"I" 是一个MyObject类型的引用。因此,在我们的表达式上,
仅仅获取对象的FirstName是"Fred"的结果(必须是一个boolean)。
内容中向右的 "=>" 是定义方法返回true和false的条件检查。那么它如何使用?
我在我的应用中创建了另一个实例。他工作非常类似与一个代理,但是它介于代理和匿名方法之间,
因为实际定义是动态的。

Listing 3

【翻译】Lambda表达式学习public   static  IEnumerable  <  ListItem  >  FindItemsWith( this  ListControl control,   Func  <  ListItem,  bool   >  result)
【翻译】Lambda表达式学习【翻译】Lambda表达式学习
{   
【翻译】Lambda表达式学习    List 
< ListItem > foundItems = new List<ListItem >();   
【翻译】Lambda表达式学习    
foreach (ListItem item in control.Items)   
【翻译】Lambda表达式学习【翻译】Lambda表达式学习    
{     
【翻译】Lambda表达式学习        
if (result(item))       
【翻译】Lambda表达式学习            foundItems.Add(item);   
【翻译】Lambda表达式学习    }
   
【翻译】Lambda表达式学习    
return foundItems;
【翻译】Lambda表达式学习}

注意使用Lambda表达式标记需要声明Func<ListItem, bool>. ListItem 对象被比较对象,
并且方法返回一个bool值。在循环之后,列表容器中每个项被循环。
Lambda表达式获取一个ListItem对象的引用,并且返回 bool 表达式;如果结果返回为true,
列表添加,并集合进行回调。

结论

想你所看到的,使用Lambda表达式真的很简单,并且嵌入到你的应用程序中。
他真正的向你的应用程序中添加了大量的功能。Lambda表达式通常是通过静态方法公开,
但是他们在其他情况下也可以很好的使用。现在.NET Framework 中最常用的用法是扩展方法,但现在则不需要了。

原文地址

翻译的不是很好,请大家指出来。谢谢。