`
北极的。鱼
  • 浏览: 158976 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Lambda表达式的前世今生

 
阅读更多

转自: http://www.cnblogs.com/OceanEyes/archive/2012/08/27/linq-2.html

 



 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托Test
{
    delegate bool FilterDelegate(int i);
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };
            List<int> newList = MyFilter(array,FilterOdd);
            foreach (int item in newList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();

        }
        static List<int> MyFilter(int[] array, FilterDelegate filter)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < array.Length; i++)
            {
                if (filter(i))
                {
                    list.Add(i);
                }
            }
            return list;
        }
        /// <summary>
        /// 偶数
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        static bool FilterEven(int i)
        {
            return i % 2 == 0;
        }
        /// <summary>
        /// 奇数
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        static bool FilterOdd(int i)
        {
            return i % 2 == 1;
        }
    }
}

 

 

//例如
delegate void Del(int x);
....
Del d = delegate(int k) { /* ... */ };

 所以上面例子小小改动一下即可:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托Test
{
    delegate bool FilterDelegate(int i);
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };
            //使用匿名方法来求偶数
            List<int> newList = MyFilter(array, delegate(int i) {

                return i % 2 == 0;
            });
         
            foreach (int item in newList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();

        }
        static List<int> MyFilter(int[] array, FilterDelegate filter)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < array.Length; i++)
            {
                if (filter(i))
                {
                    list.Add(i);
                }
            }
            return list;
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托Test
{
    delegate bool FilterDelegate(int i);
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };
            //使用Lambda表达式来求偶数
            List<int> newList = MyFilter(array, i => i % 2==0);
         
            foreach (int item in newList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();

        }
        static List<int> MyFilter(int[] array, FilterDelegate filter)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < array.Length; i++)
            {
                if (filter(i))
                {
                    list.Add(i);
                }
            }
            return list;
        }
    }
}

 

 

(请注意,我标注出来的Fun<T,TResult>是一个委托!) 

所以再对上面的Filter进行改进:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 委托Test
{
    //delegate bool FilterDelegate(int i);
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 1, 2, 3, 5, 6, 6, 7, 8, 9 };
            //使用匿名方法来求偶数
            //List<int> newList = MyFilter(array, delegate(int i) {

            //    return i % 2 == 0;
            //});
            //使用Lambda表达式求偶数
            List<int> newList = MyFilter(array, i => i % 2 == 0);
         
            foreach (int item in newList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();

        }
        //Func<int,bool>: 封装了一个具有一个int参数并且返回类型为bool类型的方法
        static List<int> MyFilter(int[] array,Func<int,bool> filter)
        {
            List<int> list = new List<int>();
            for (int i = 0; i < array.Length; i++)
            {
                if (filter(i))
                {
                    list.Add(i);
                }
            }
            return list;
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LambdaDemo
{
    class Program
    {
        static void Main(string[] args)
        {
           
            string[] names = {"Eyes","Voodoo","Tod","Chris","Christina","Maxisim" };
            Func<string, bool> filter = s => s.Length > 5;
            Func<string, string> order = s => s;
            Func<string, string> operating = s => s.ToUpper();

            IEnumerable<string> expr = names.Where(filter).OrderByDescending(order).Select(operating);
            expr.ToList<string>().ForEach(i => Console.WriteLine(i));
            Console.ReadKey();

        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace Lambda表达式树
{
    class Program
    {
        static void Main(string[] args)
        {
            //计算(Price-5)*Count*Rebate
            ParameterExpression paraPrice = Expression.Parameter(typeof(decimal),"price");
            ConstantExpression constant = Expression.Constant(5m,typeof(decimal));
            BinaryExpression result1 = Expression.Subtract(paraPrice, constant);

            ParameterExpression paraCount = Expression.Parameter(typeof(decimal),"count");
            ParameterExpression paraRebate = Expression.Parameter(typeof(decimal),"rebate");
            BinaryExpression result2 = Expression.Multiply(paraCount,paraRebate);

            BinaryExpression result3 = Expression.Multiply(result1,result2);
            Expression<Func<decimal, decimal, decimal, decimal>> totalPrice = Expression.Lambda<Func<decimal, decimal, decimal, decimal>>(result3,paraPrice,paraCount,paraRebate);
            Func<decimal, decimal, decimal, decimal> myFun = totalPrice.Compile();
            Console.WriteLine(myFun(125m,10m,0.5m));
            Console.ReadKey();

        }
      
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
         
            Expression<Func<int, int>> f1 = x => x + 1;
            //f1(1)//...错误,必须将表达式树表示的代码编译成一个可执行委托
            Func<int, int> f2 = f1.Compile();
            Console.WriteLine(f2(2));
            Console.ReadKey();
        }
    }
}

 

 

  • 大小: 33.1 KB
  • 大小: 22.6 KB
  • 大小: 34.8 KB
  • 大小: 108.7 KB
  • 大小: 23.9 KB
  • 大小: 31.1 KB
  • 大小: 56 KB
  • 大小: 15.2 KB
  • 大小: 7.4 KB
分享到:
评论
2 楼 北极的。鱼 2014-07-10  
摘录自MSDN
表达式 lambda
表达式位于 => 运算符右侧的 lambda 表达式称为“表达式 lambda”。 表达式 lambda 广泛用于表达式树(C# 和 Visual Basic)的构造。 表达式 lambda 会返回表达式的结果,并采用以下基本形式:
(input parameters) => expression

仅当 lambda 只有一个输入参数时,括号才是可选的;否则括号是必需的。 括号内的两个或更多输入参数使用逗号加以分隔:
(x, y) => x == y

有时,编译器难以或无法推断输入类型。 如果出现这种情况,你可以按以下示例中所示方式显式指定类型:
(int x, string s) => s.Length > x

使用空括号指定零个输入参数:
() => SomeMethod()
在上一个示例中,请注意表达式 Lambda 的主体可以包含一个方法调用。 但是,如果要创建在 .NET Framework 之外计算的表达式目录树(例如,在 SQL Server 中),则不应在 lambda 表达式中使用方法调用。 在 .NET 公共语言运行时上下文之外,方法将没有任何意义。
1 楼 北极的。鱼 2014-07-10  
另外的资料就是MSDN

http://msdn.microsoft.com/zh-cn/library/bb397687.aspx


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

相关推荐

    Lambda表达式的前世今生 - 文章 - 伯乐在线1

    Lambda表达式是现代编程语言中的一种强大工具,特别是在C#中,它的引入极大地简化了对函数式编程的支持。本文将深入探讨Lambda表达式的起源、发展以及其在C#中的应用。 Lambda表达式起源于数学中的λ演算,这是一种...

    C#lambda表达式的使用

    "C# Lambda 表达式的使用" Lambda 表达式是 C# 编程语言中的一个重要概念,也是函数式编程的基础。Lambda 表达式可以被用作创建委托对象或表达式树类型。所有的 Lambda 表达式都使用操作符“=&gt;“,表示“goes to ...

    2_Lambda表达式.zip

    Lambda表达式是Java编程语言中的一个关键特性,自Java 8开始引入,它极大地简化了函数式编程,尤其是在处理集合数据时。Lambda表达式的主要目的是为了创建匿名函数,即没有名字的函数,它可以被当作一个值传递给方法...

    Java8的lambda表达式

    Java8的Lambda表达式是Java语言的一次重大更新,它引入了函数式编程的概念,极大地简化了处理匿名函数的方式,特别是在处理集合和并发操作时。Lambda表达式使得代码更加简洁、易读,同时也提升了程序的执行效率。在...

    C#将Lambda表达式转成Sql语句

    在.NET框架中,C#是一种强大的编程语言,它支持Lambda表达式,这使得代码更加简洁、易读。Lambda表达式通常用于LINQ(Language Integrated Query)查询,它允许程序员使用类似SQL的语法在内存中的数据集上进行操作。...

    Java 8 lambda表达式

    Java 8 的引入,尤其是Lambda表达式,对Java语言产生了深远的影响,它为Java开发者带来了更简洁、更灵活的编程方式。Lambda表达式是函数式编程的核心元素,它允许我们将函数作为方法参数传递,或者将代码块当作数据...

    java8 lambda表达式学习总结

    Java 8 的 Lambda 表达式是其最显著的新特性之一,它引入了一种更为简洁、函数式的编程风格。Lambda 表达式使得处理匿名函数变得更加简单,尤其在需要定义短小、无状态的代码块时,它们可以极大提高代码的可读性和...

    C++ 中的 Lambda 表达式

    ### C++ 中的 Lambda 表达式 #### 引言 C++11引入了许多重要的新特性,其中最显著的一项是Lambda表达式。这一特性极大地简化了代码编写过程,使得开发者能够更方便地创建匿名函数对象。Lambda表达式在很多场景下都...

    C++ 11 lambda 表达式

    C++ 11引入了lambda表达式,这是一个强大的特性,极大地增强了C++的函数式编程能力。Lambda表达式允许在程序中直接定义匿名函数,并且可以直接在需要的地方使用,无需预先声明。这对于处理回调函数、简化算法实现...

    lambda表达式和递归算法

    lambda 表达式和递归算法 lambda 表达式是一种匿名函数,可以用来定义小的、单次使用的函数。它通常用于数据处理、事件处理和其他需要临时函数的情况。lambda 表达式的基本语法是:`lambda arguments : expression`...

    java8lambda表达式Demo

    Java 8 是一个重要的Java平台版本,因为它引入了许多新特性,其中最显著的就是Lambda表达式。Lambda表达式是函数式编程的关键元素,它允许我们以更简洁、更易读的方式编写代码,特别是在处理集合和并发任务时。在这...

    JavaLambda表达式和匿名类.pdf

    Java 8 引入了Lambda表达式,这是对传统编程方式的一大革新,它极大地简化了函数式编程,尤其是在处理集合和并发操作时。Lambda表达式是Java 8中的一种语法糖,它允许开发者以更简洁的方式定义无状态、无副作用的...

    jdk1.8 Lambda表达式

    Java 8 引入的 Lambda 表达式是 Java 编程语言的重大变革之一,它允许以更简洁的方式表示单方法接口的实现,极大地增强了 Java 语言的表达能力,尤其是结合了函数式接口、Stream API 和其他新特性后。接下来,我们将...

    精通lambda表达式: java多核编程

    《精通Lambda表达式:Java多核编程》这本书深入探讨了Java编程中的一种重要特性——Lambda表达式,以及如何在多核环境下充分利用这一特性提高程序性能。Lambda表达式是Java 8引入的关键特性之一,它极大地简化了函数...

    Lambda表达式的例子

    Lambda表达式是Java 8引入的一种新的编程特性,它极大地简化了函数式编程,并使得代码更加简洁、易读。在Java中,Lambda表达式可以被理解为匿名函数,即没有名字的函数,它可以被当作方法参数传递,或者作为类的成员...

    将字符串转换为lambda表达式

    在编程领域,`lambda`表达式是一种简洁的创建匿名函数的方式,它允许我们在不定义完整函数的情况下使用函数。在Python中,`lambda`表达式特别常见,因为它们可以帮助我们快速编写简洁的一行函数。本文将深入探讨如何...

    Java lambda表达式和JVM字节码功能详解.pdf

    Java Lambda表达式是Java 8引入的一个重要特性,它极大地简化了函数式编程风格的实现。Lambda表达式允许我们将函数作为一个值传递,就像传递其他数据类型一样。这在处理集合、事件驱动编程以及多线程等场景下尤其...

    一份易上手的C# Lambda表达式入门学习资料

    C# Lambda表达式入门学习资料 本文旨在为新手提供易于理解的C# Lambda表达式入门学习资料,帮助读者快速掌握Lambda表达式的基础知识和应用场景。 Lambda表达式是什么? -------------------- Lambda表达式是一种...

    Stream、Lambda表达式练习.doc

    Stream和Lambda表达式实践 在Java中,Stream API是Java 8中引入的一种新的数据处理方式,它可以对集合进行各种操作,如过滤、映射、聚合等。Lambda表达式是Java 8中引入的一种新的函数式编程方式,它可以将函数作为...

    Lambda表达式测试demo

    Lambda表达式是Java 8引入的一种新特性,它极大地简化了函数式编程,使得代码更加简洁、易读。Lambda表达式本质上是匿名函数,可以理解为没有名字的函数,但功能与普通方法相同,能够被赋值给变量,也可以作为参数...

Global site tag (gtag.js) - Google Analytics