0.要点

1.匿名函数与 lambda表达式

2.lambda表达式的书写格式

3.lambda表达式示例

 

1. 匿名函数与lambda表达式

         Lambda 表达式(拉姆达表达式) 和 匿名方法 其实是一件事情。唯一的不同是:他们语法表现形式不同。Lambda 表达式是在语法方面的更进一步的进化。在本质上,他们是一件事情。他们的作用都是:产生方法。即:内联方法。

        引用自 C#首席架构师Anders Hejlsberg 的原话: lambda expressions and anonymous methods are really just two words for the same thing. The only thing that differs is, "What does the syntax look like?" And the lambda expressions are a further evolution of the syntax.But underneath, they do the same thing. They generate methods. You know, they're in-line methods.

         所以:我们要了解 Lambda 表达式 就应该同时也了解 匿名方法。

        下面先看一个简单的代码例子,分别用匿名方法和Lambda 表达式来实现对数组的搜索:

匿名方法

    static void Main(string[] args)
    {
        string[] list = new string[] { "apple", "banana", "orange" };
        string[] afruit = Array.FindAll<string>(list, 
            delegate(string s)
            {
                return s.IndexOf('a') >0;
            });
        foreach (string s in afruit)
        {
            Console.WriteLine(s);
        }
        Console.Read();
    }

 

Lambda表达式

    static void Main(string[] args)
    {
        string[] list = new string[] { "apple", "banana", "orange" };
        string[] afruit = Array.FindAll<string>(list, (s=>s.IndexOf('a')>0));
        foreach (string s in afruit)
        {
            Console.WriteLine(s);
        }
        Console.Read();
    }
从上面的例子中,我们可以看出:

从代码书写角度,代码可读性角度来说:Lambda表达式 比匿名方法更简单了。

而 Lambda表达式 和 匿名方法都是干的同一件事情,让我们少写一个函数定义。函数的调用和函数的实现在一起完成了。

 

2.lambda表达式的书写格式

    (int x) => x 1 // 显式类型参数
     (y,z) => return y * z; // 隐式类型参数

      (参数列表) => 表达式或者语句块

       其中:

      参数个数:可以有多个参数,一个参数,或者无参数。

      参数类型:可以隐式或者显式定义。

      表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。

     匿名函数和lambda表达式都是函数式编程思想下的产物,函数式编程如果从定义上来理解是比较晦涩的,但是简单的来说:函数式编程的主要特点就是没有变量,所有算法都用递归函数来编写。整个程序除了定义函数就是调用函数,没有其他类型的语句。

 

 

3.lambda表达式示例

       从上面的例子中我们已经看到,lambda表达式能减少不少代码。不过,最节省代码的地方更应该是其“分组”和“字典转化”等功能,下面我们来看看下面的例子

索引示例

      大家都知道一般在英文书的后面都会有索引(Index)这个东西,它其实就是“列出所有的关键字,根据其首字母进行分组,并且要求对每组内部的关键字进行排序”。简单说来,我们需要的其实是这么一个方法:

        static Dictionary< char, List< string>> GetIndex(IEnumerable< string> keywords) { /*...*/ } 
    下面是具体的代码
        static Dictionary<char, List<string>> GetIndex(IEnumerable<string> keywords) 
        {
            //定义字典
            var result = new Dictionary<char, List<string>>();

            //填充字典
            foreach (var kw in keywords)
            { 
                var firstword=kw[0];
                List<string> groupKeywords;

                if (!result.TryGetValue(firstword, out groupKeywords))
                {
                    groupKeywords = new List<string>();
                    result.Add(firstword, groupKeywords);
                }
                groupKeywords.Add(kw);
            }
            foreach(var groupKeywords in result.Values)
            {
                groupKeywords.Sort();
            }
            return result;
        }

        如果使用Lambda表达式及.net框架中定义的扩展方法,代码就减少了很多

        static Dictionary<char, List<string>> GetIndex(IEnumerable<string> keywords) 
        {
            return keywords
                .GroupBy(k=>k[0])   //按照首字母分组
                .ToDictionary(          //构造字典
                    g=>g.Key,           //以每组的KEY作为键
                    g=>g.OrderBy(k=>k).ToList());   //对每组排列生成列表
        }

 

         因为有了Lambda表达式,.NET中的一些函数式编程特性才被真正推广开来,为了深入了解lambda表达式及函数式编程,下节我将进入F#的学习。

        

 

 

参考资料

http://decijam.spaces.live.com/Blog/cns!DE71A258DA9B4603!308.entry?wa=wsignin1.0&sa=864998688