Lambda 表达式是一种可用于创建委托表达式目录树类型的匿名函数通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。 Lambda 表达式对于编写 LINQ 查询表达式特别有用。

若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。 例如,lambda 表达式 x => x * x 指定名为 x 的参数并返回 x 的平方值。

代码示例1:

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}

语句 lambda 的主体可以包含任意数量的语句;但是,实际上通常不会多于两个或三个。

delegate void TestDelegate(string s);
…
TestDelegate myDel = n => { 
             string s = n + " " + "World";
             Console.WriteLine(s); 
    };
myDel("Hello");

LINQ 查询代码示例

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;

namespace PLINQExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 代码演示 将一个顺序查询转换成并行查询
        /// 查询的是本程序集中定义的所有过时(obsolete)方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Assembly assembly = Assembly.GetEntryAssembly();

            var query =
                from type in assembly.GetExportedTypes().AsParallel()

                from method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)

                let obsoleteAttrType = typeof(ObsoleteAttribute)

                where Attribute.IsDefined(method, obsoleteAttrType)

                orderby type.FullName

                let obsoleteAttrObj = (ObsoleteAttribute)Attribute.GetCustomAttribute(method, obsoleteAttrType)

                select String.Format("Type = {0}\nMethod = {1}\nMessage = {2}\n", 
                                      type.FullName, method.ToString(), obsoleteAttrObj.Message);

            // 显示结果
            foreach (var result in query)
                MessageBox.Show(result);
            
            // 这个方法允许多个线程同时处理结果
            //query.ForAll(Whatever.MakeTip);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Whatever.MakeTip("过时方法");
        }
    }

    // 第二个参数若设置为true,则将使用已过时的元素视为错误
    [Obsolete("该类已经过时", false)]
    public class Whatever
    {
        // 定义过时方法
        // [Obsolete]
        [method: Obsolete("该方法已经过时")]
        public static void MakeTip(string sMsg)
        {
            MessageBox.Show(sMsg);
        }
    }
}

 

posted on 2015-03-10 11:19  花爱春  阅读(144)  评论(0编辑  收藏  举报