字母拼凑者之家

每天向前一小步
随笔 - 5, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

LINQ学习笔记之二 —— Lambda表达式和Lambda表达式树

 

LINQ学习笔记之二

——Lambda表达式和Lambda表达式树

 

    Lambda表达式(Lambda Expressions)是LINQ实现的另一特性。Lambda表达式的作用就是使用使用函数式语法,将方法实现关联到委托实例。在使用查询表达式(Query Expressions)时,查询表达式也将被语法映射为扩展方法(Extension Methods)和Lambda表达式配合使用的形式。

    先来说说Lambda表达式的“前身”——匿名方法(Anonymous Methods)。匿名方法是.NET Framework 2.0中的新特性,意义就在于使用更简单的语法将方法实现关联到委托(delegate)实例。例如:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

// 匿名方法演示

namespace MyConsoleApplication

{

    class Program

    {

        delegate void MyDelegate(string x, int y);

 

        // 自动属性

        static string Name { get; set; }

 

        static int Age { get; set; }

 

        static void Main(string[] args)

        {

            // 匿名方法实现MyDelegate委托

            MyDelegate anonymousMethod = delegate(string x, int y) { Name = x; Age = y; };

            MyOtherMethod(anonymousMethod);

            MyOtherMethod(delegate(string x, int y) { Name = x + " second"; Age = y; });

            Console.Read();

        }

 

        static void MyOtherMethod(MyDelegate myDelegate)

        {

            myDelegate("set in delegate", 20);

            Console.WriteLine(string.Format("Name:{0} | Age:{1}", Name, Age.ToString()));

        }

    }

}

 

结果显示:

Name:set in delegate | Age:20

Name:set in delegate second | Age:20

如果使用Lambda表达式实现相同的功能,语法相比匿名方法要简单一些,如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

// Lambda表达式演示

namespace MyConsoleApplication

{

    class Program

    {

        delegate void MyDelegate(string x, int y);

 

        // 自动属性

        static string Name { get; set; }

 

        static int Age { get; set; }

 

        static void Main(string[] args)

        {

            // Lambda表达式实现MyDelegate委托

            MyDelegate anonymousMethod = (string x, int y) => { Name = x; Age = y; };

            MyOtherMethod(anonymousMethod);

            MyOtherMethod((x, y) => { Name = x + " second"; Age = y; });

            Console.Read();

        }

 

        static void MyOtherMethod(MyDelegate myDelegate)

        {

            myDelegate("set in delegate", 20);

            Console.WriteLine(string.Format("Name:{0} | Age:{1}", Name, Age.ToString()));

        }

    }

}

 

结果显示:

Name:set in delegate | Age:20

Name:set in delegate second | Age:20

查看IL代码,使用Lambda表达式与使用匿名方法的IL代码一致,可以说,Lambda表达式最终会编译成匿名方法的IL代码,只是语法上的区别罢了。

————————— 华丽的分割线 ——————————

    简单总结:

1.       Lambda表达式的基本形式是:(参数列表)=>表达式或语句块。

2.       Lambda表达式的特点就是:参数列表可以不指定参数类型,由编译器进行推断。但需要注意,在多个参数的情况下,如果不显示指定参数类型,所有的参数都不应指定参数类型;如果显示指定参数类型,所有的参数都应显示指定参数类型。

3.       如果委托有返回类型,可以再语句块中进行返回。如果委托无参数,Lambda表达式的语法为:()=>表达式或语句块。示例如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

// Lambda表达式演示

namespace MyConsoleApplication

{

    class Program

    {

        delegate int MyDelegate1(int y);

 

        delegate void MyDelegate2();

 

        static void Main(string[] args)

        {

            // 有返回值

            MyDelegate1 my1 = y => { return y + 10; };

            // 无参数

            int x = 10;

            MyDelegate2 my2 = () => x = 10;

        }

    }

}

————————— 华丽的分割线 ——————————

Lambda表达式树(Lambda Expressions Tree)简单介绍:

Lambda表达式树就是将Lambda表达式分解成树状结构(还没有想到具体的用途...)。使用Lambda表达式树,需要引入System.Linq.Expressions命名空间;如果分解Lambda表达式,表达式主体(=>右边部分)不能是语句块或等式。示例如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Linq.Expressions;

 

// Lambda表达式树演示

// 获得表达式实例后就可以进行分解了

namespace MyConsoleApplication

{

    class Program

    {

        delegate int MyDelegate1(int y);

 

        delegate bool MyDelegate2();

 

        static void Main(string[] args)

        {

            // 获得返回int型的Lambda表达式实例

            Expression<MyDelegate1> my1 = y => y + 10;

            // 获得返回bool型的Lambda表达式实例

            int x = 10;

            Expression<MyDelegate2> my2 = () => x > 10;

            // 利用系统委托Func获得返回bool型的Lambda表达式实例

            // Func泛型委托很重要

            Expression<Func<bool>> sys1 = () => 1 > 2;

        }

    }

}

 

本文属本博主原创,欢迎同人们批评指教,如需转载请告知博主,谢谢!!!
博主联系方式:jimmy_green@163.com

posted on 2008-07-17 21:15 LeonSun 阅读(188) 评论(0)  编辑 收藏 网摘 所属分类: LINQ学习


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索



相关文章:

相关链接: