Lambda表达式

"Lambda表达式"是一个匿名函数,它可以包含表达式和语句.并可用于创建委托或表达式目录树类型.

运算符

所有Lambda表达式都是用Lambda运算符=>,读做goes to.该运算符左边是输入参数,右边包含表达式或语句块.

Lambda表达式 x=>x*x读作 x goes to x 乘 x.可将此表达式分配给委托类型.

例:

protected void Page_Load(object sender, EventArgs e)
{
    cc c = x => x * x;

    Response.Write(c(12).ToString());
}

public delegate int cc(int i);

在上例中,请注意委托的参数是一个具有int类型的隐式类型输入参数,并返回int.在将lambda表达式转化为该类型的委托时,编译器会隐式的将该表达式中的参数转换为int.并返回一个int类型的值.

=>运算符具有与=运算符同级的优先级,并且是右结合运算符.

Lambda表达式

表达式在右边的Lambda表达式称为"Lambda表达式".采用以下基本形式.

(input parameters)=>expression

在lambda表达式只有一个参数时,括号才是可选的;否则括号是必须的.建议保留括号.

Lambda语句

Lambda语句与Lambda表达式相似,只是语句包含在大括号里.

(input parameters)=>{statement;}

Lambda语句的主体可以包含任意数量的语句.但是通常不会多与两句或三句.

Lambda表达式的类型推理

在编写Lambda时,通常不必为输入参数指定类型,因为编译器可以基于Lambda主体、基础委托类型以及C#3.0语言规范中描述的其他因素推断类型.

Lambda的一般规则如下:

1.lambda包含的参数数量必须与委托类型包含的参数数量一致

2.lambda中每个输入参数必须都能够隐式转换为其对应的委托参数

3.lambda的返回值必须能隐式的转换为委托的返回类型

例子:

bool GetStringWithFourCharacters(string str)
{
    return str.Length == 4;
}

protected void Page_Load(object sender, EventArgs e)
{
    string[] strs = new string[] { "abcd""bcde", "123s", "acee",  };

    //方法一、
    //创建Func<string,bool>的实例这种方式来获取方法与下面一种直接赋值的做法都可以.
    //Func<string, bool> func = new Func<string, bool>(GetStringWithFourCharacters);
    Func<string, bool> func = GetStringWithFourCharacters;
    IEnumerable<string> result = strs.Where<string>(func);

    //方法二、
    //IEnumerable<string> result = strs.Where<string>(delegate(string x) { return x.Length == 4; });

    //方法三、
    //IEnumerable<string> result = strs.Where<string>(x => x.Length == 4);
    foreach (var r in result)
    {
        Response.Write(r.ToString()+"<br/>");
    }
}

这三种方式都可以实将字符串数组中,为四个字符的字符串挑出来的功能.但是,哪一个最简单呢?显然第一个复杂些,第二个和第三个都比较简单.

其实第二个和第三个是等价的.建议使用第三种,上面的例子比较简单,只需要筛选出来即可,如果再要求都转成大写的呢? 再进行排序呢?

protected void Page_Load(object sender, EventArgs e)
{
    string[] strs = new string[] { "abcd", "bcde", "123s", "acee" };

    //方法二
    //IEnumerable<string> result = strs.Where<string>(delegate(string x) { return x.Length == 4; })
    //                                 .Select<string, string>(delegate(string x) { return x.ToUpper(); })
    //                                 .OrderBy<string, string>(x => x);
    
    //方法三
    IEnumerable<string> result = strs.Where<string>(x => x.Length == 4)
                                    .Select<string, string>(x => x.ToUpper())
                                    .OrderBy<string, string>(x => x);
    
    foreach (var r in result)
    {
        Response.Write(r.ToString()+"<br/>");
    }
}

从代码中,可以看到,使用Lambda表达式似乎更简单一些的

Lambda表达式在上例中的使用是:

    1. 选出只有4个字符的字符串
    2. 将字符串变成大写的
    3. 进行排序
posted @ 2010-09-07 15:48  Localhost  阅读(655)  评论(0编辑  收藏  举报