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();
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值