首页 > 软件开发 > 锅炉软件 > 锅炉成本核算软件 > 通过锅炉参数代码来详解lambda表达式的C#用法
2015
07-26

通过锅炉参数代码来详解lambda表达式的C#用法

先说说lambda的好处吧,就是简化了匿名委托的使用,让你让代码更加简洁,优雅。对于C#初学者来说是不是很难理解。那么让我慢慢通过例子给你介绍吧。

1 lambda简介

  lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”。运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。

 lambda表达式: 1.一个参数:param=>expr  2.多个参数:(param-list)=>expr

上面这些东西,记着,下面我们开始应用并阐述lambda,让你乐在其中。


2.举例来解释下


namespace Thelambda
{
    public class Boiler
    {
        public string leixing { get; set; }
        public int Wendu  {  get;set; }    
    }
    class Program
    {

        public static List<Boiler> BoilerList()
        {
            List<Boiler> boiler = new List<Boiler>();
            for (int i = 0; i < 7; i++)
            {
                Boiler p = new Boiler() { leixing = i + "吨蒸汽锅炉", Wendu = 250, };
                boiler.Add(p);                
            }
            return persons;
        }

        static void Main(string[] args)
        {
            List<Boiler> boilers = BoilerList();
            boilers = boilers.Where(p => p.Wendu > 200).ToList();       //所有温度>200的锅炉的组合
            Boiler per = boilers.SingleOrDefault(p => p.leixing == 10吨蒸汽锅炉);  //类型为10吨蒸汽锅炉的单个锅炉
            boilers = boilers.Where(p => p.leixing.Contains("蒸汽")).ToList();   //所有类型里包括蒸汽的锅炉的集合
        }
    }
}

3.看看委托情况下如何使用Lambda

//委托  逛超市
        delegate int GuangChaoshi(int a);
        static void Main(string[] args)
        {
            GuangChaoshi gwl = JieZhang;
            Console.WriteLine(gwl(10) + "");   //打印20,委托的应用
            Console.ReadKey();
        }
        
        //结账
        public static int JieZhang(int a)
        {
            return a + 10;
        }

转化为用Lambda

//委托  逛超市
        delegate int GuangChaoshi(int a);
        static void Main(string[] args)
        {          
           // GuangChaoshi gwl = JieZhang;
            GuangChaoshi gwl = p => p + 10;
            Console.WriteLine(gwl(10) + "");   //打印20,表达式的应用
            Console.ReadKey();
        }

4.再复杂再复杂

1.多参数的 

//委托  逛超市
        delegate int GuangChaoshi(int a,int b);
        static void Main(string[] args)
        {            
            GuangChaoshi gwl = (p,z) => z-(p + 10);
            Console.WriteLine(gwl(10,100) + "");   //打印80,z对应参数b,p对应参数a
            Console.ReadKey();
        }

 2.运算主体复杂

/// <summary>
        /// 委托  逛超市
        /// </summary>
        /// <param name="a">花费</param>
        /// <param name="b">付钱</param>
        /// <returns>找零</returns>
        delegate int GuangChaoshi(int a,int b);
        static void Main(string[] args)
        {
            GuangChaoshi gwl = (p, z) =>
            {
                int zuidixiaofei = 10;
                if (p < zuidixiaofei)
                {
                    return 100;
                }
                else
                {
                    return z - p - 10;
                }
           
            };
            Console.WriteLine(gwl(10,100) + "");   //打印80,z对应参数b,p对应参数a
            Console.ReadKey();
        }

说到这里,其实还要介绍一个Func<T>委托

static void Main(string[] args)
        {
            Func<int, int, bool> gwl = (p, j) =>
                {
                    if (p + j == 10)
                    {
                        return true;
                    }
                    return false;
                };
            Console.WriteLine(gwl(5,5) + "");   //打印‘True’,z对应参数b,p对应参数a
            Console.ReadKey();
        }

从这个例子,我们能看到,p为int类型,j为int类型,返回值为bool类型.看完上面两个例子,相信大家应该明白啦Func<T>的用法:多个参数,前面的为委托方法的参数,最后一个参数,为委托方法的返回类型。

最后放大招

Lambda动态函数树

static void Main(string[] args)
        {
            //i*j+w*x
            ParameterExpression a = Expression.Parameter(typeof(int),"i");   //创建一个表达式树中的参数,作为一个节点,这里是最下层的节点
            ParameterExpression b = Expression.Parameter(typeof(int),"j");
            BinaryExpression be = Expression.Multiply(a,b);    //这里i*j,生成表达式树中的一个节点,比上面节点高一级

            ParameterExpression c = Expression.Parameter(typeof(int), "w");
            ParameterExpression d = Expression.Parameter(typeof(int), "x");
            BinaryExpression be1 = Expression.Multiply(c, d);

            BinaryExpression su = Expression.Add(be,be1);   //运算两个中级节点,产生终结点

            Expression<Func<int, int, int, int, int>> lambda = Expression.Lambda<Func<int, int, int, int, int>>(su,a,b,c,d);

            Console.WriteLine(lambda + "");   //打印‘(i,j,w,x)=>((i*j)+(w*x))’,z对应参数b,p对应参数a

            Func<int, int, int, int, int> f= lambda.Compile();  //将表达式树描述的lambda表达式,编译为可执行代码,并生成该lambda表达式的委托;

            Console.WriteLine(f(1, 1, 1, 1) + "");  //打印2
            Console.ReadKey();
        }

通过锅炉参数代码来详解lambda表达式的C#用法 - 第1张  | 风影流水的博客

上面这个图有助于你的理解。

最后说说成本核算软件的进度吧,目前开始制作库存价格核算了。大家对于锅炉成本核算有什么好的建议的,我们可以相互交流下~~



最后编辑:
作者:wxcad
这个作者貌似有点懒,什么都没有留下。