C#:Lambda 表达式

之前介绍过匿名方法,可以帮我们少敲很多代码,这里又有一个更好的方式可以帮我们少码更多的字大笑,就是Lambda 表达式。

Lambda 表达式是匿名函数,它可以为委托赋值,也可以为表达式树赋值。

先介绍为委托赋值:

举个简单的例子:

过去我们是这么声明一个委托,并且执行委托中的方法的,如:

        public delegate int Add(int x);

        static void Main(string[] args)
        {
            Add add = delegate(int x)
            {
                return x + 15;
            };
            Console.WriteLine(add(5));
            Console.ReadLine();
        }
返回 20

上面是用匿名方法为委托赋值,现在不这样写,利用Lambda 表达式为上述委托赋值:

        public delegate int Add(int x);

        static void Main(string[] args)
        {
            Add add = x => x+15;//如果委托只有一个参数,这里的()可以省,但是0个参数或者>1个参数时,()不能省略;
            Console.WriteLine(add(5));
            Console.ReadLine();
        }
还是返回 20

可能咋一看并不是太懂,其实主函数里的第一句话是一种省略写法,完整的写法是:

Add add = (x) => { return x + 15; };

到这里,刚接触Lambda 表达式的时候可能感觉有点奇怪,我随便写变量名(如上面的x),系统是如何知道我的变量x是什么类型的?MSDN是这么解释的:

在编写 Lambda 时,通常不必为输入参数指定类型,因为编译器可以根据 Lambda 主体、基础委托类型以及 C# 语言规范中描述的其他因素推断类型。 

如果要硬写变量类型也是可以的,不过完全没必要。

如果委托有两个参数:可以这么写

        public delegate int Add(int x,int y);

        static void Main(string[] args)
        {
            Add add = (x,y) => x+y;//参数和参数之间以逗号分隔
            Console.WriteLine(add(5,20));
            Console.ReadLine();
        }
如果委托返回的不是int型,如返回string,可以这么写:

        public delegate string Add(int x, int y);

        static void Main(string[] args)
        {
            Add add = (x, y) => (x + y).ToString();//或者Add add = (x,y) => {return (x+y).ToString();};
            Console.WriteLine(add(5, 20));
            Console.ReadLine();
        }


上面介绍了用Lambda表达式为简单的一些委托赋值,接下来介绍类型推断提供的真正的方便。

对于类型推断的好处就是可以利用智能提示,其实在我们编码过程中,编译器就已经帮我们推断出了参数类型,:

        public delegate bool CheckMovie(Movie movie);

        static void Main(string[] args)
        {
            CheckMovie ss = a => a.Name == "少林足球";

            bool result=ss(new Movie { Name = "少林足球" });

            Console.WriteLine(result);
            Console.ReadLine();
        }
如上述代码,当我们打出a.的时候,Name属性已经自动提示出来了。因为编译器已经推断出了a的类型是Movie,这样敲代码就方便多了。其中Movie是随便自定义的一个类:

    public class Movie
    {
        public string Name { get; set; }
        public string artist { get; set; }
        public string genre { get; set; }
        public decimal price { get; set; }
    }
返回True

或者我们要在众多电影中寻找某一部电影:

public delegate Movie SelectMovie(IEnumerable<Movie> movie);
        static void Main(string[] args)
        {
            IEnumerable<Movie> movies = new List<Movie> { 
                new Movie{Name="功夫"},
                new Movie{Name="晚秋"},
                new Movie{Name="少林足球"}
            };
            //编译器自动推断出了c的类型是IEnumerable<Movie>
            SelectMovie selectMovie = c =>
            {
                Movie mv = new Movie();
                foreach (var item in c)
                {
                    if (item.Name == "少林足球")
                    {
                        mv = item;
                        break;
                    }
                }
                return mv;
            };
            Console.WriteLine("已经找到:" + selectMovie(movies).Name);
            Console.ReadLine();
        }

或者我们要在众多电影中寻找某些由特定演员主演的:

        public delegate IEnumerable<Movie> SelectMovie(IEnumerable<Movie> movie);
        static void Main(string[] args)
        {
            IEnumerable<Movie> movies = new List<Movie> { 
                new Movie{Name="功夫",artist="周星驰"},
                new Movie{Name="晚秋",artist="汤唯"},
                new Movie{Name="少林足球",artist="周星驰"}
            };
            //编译器自动推断出了c的类型是IEnumerable<Movie>,a的类型是Movie
            SelectMovie selectMovie = c => c.Where(a => a.artist == "周星驰");
            IEnumerable<Movie> ms = selectMovie(movies);

            foreach (var item in ms)
            {
                Console.WriteLine(item.artist + "----" + item.Name);
            }

            Console.ReadLine();
        }

返回:

接下来看看Lambda 表达式中的变量范围:

      public delegate bool Test();

        static void Main(string[] args)
        {
            int t = 20;
            Test td = () => {
                t = 25;
                return t > 21 ? true : false;
            };
            Console.WriteLine(t);
            td();
            Console.WriteLine(t);
            Console.ReadLine();
        }
返回:


可以看到,Lambda 表达式在为委托赋值时是没有操作外部的值类型的变量的。只有真正的执行委托中的方法后才会改变外部的值类型的变量值。

接下来试试在lambda表达式中操作引用型的外部变量:

        public delegate bool Test();

        static void Main(string[] args)
        {
            Movie mm = new Movie { Name="周星驰"};
            
            Test td = () => {
                mm.Name = "汤唯";
                return mm.Name == "周星驰" ? true : false;
            };
            Console.WriteLine(mm.Name);
            td();
            Console.WriteLine(mm.Name);
            Console.ReadLine();
        }


可以看到,跟操作值类型的外部变量是一个效果。


综上,Lambda 表达式为委托赋值就先这么多。


接下来介绍Lambda 表达式为表达式树赋值:

        public delegate bool Test(int x);

        static void Main(string[] args)
        {
            Expression<Test> tt = a => a == 10;
            Test ts = tt.Compile();
            Console.WriteLine(ts(20));
            Console.ReadLine();
        }
上述代码,检测方法的参数是否等于10,不等于就返回False,这里返回Flase.


在日常使用中,表达式树经常跟Func<T,TResult>委托配合使用,如上述的委托可以表示成Func<int,bool>委托,不清楚Func<T,TResult>的可以看这里

        static void Main(string[] args)
        {
            Expression<Func<int, bool>> fc = c => c > 10;
            Func<int, bool> ff = fc.Compile();
            Console.WriteLine(ff(5));
            Console.ReadLine();
        }
上述代码判断整形参数是否大于10,这里参数值为5,返回False


关于使用Lambda表达式为委托,表达式树赋值就先记录到这里。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#lambda表达式是一种简洁而强大的语法形式,用于定义匿名函数。它的语法结构类似于= > 运算符,左侧是参数列表,右侧是表达式或语句块。 Lambda表达式可以用于多种情况,比如作为参数传递给函数,定义委托类型,或在LINQ查询中使用。它可以代替繁琐的匿名方法或命名的方法,使代码更加简洁和易读。 在C#中,lambda表达式可以分为两种类型:表达式Lambda和语句Lambda表达式Lambda是指只有一个表达式lambda,它只能包含一个表达式并返回其结果。 例如,下面的代码演示了如何使用表达式Lambda来定义一个匿名函数并进行计算: ``` Func<int, int> func = x => x * 4; int result1 = func(5); //[1] ``` 这段代码定义了一个接受一个int类型参数并返回int类型结果的函数。通过表达式Lambda,我们将输入的参数乘以4并返回结果。然后,我们可以通过调用func方法并传入参数5来获得计算结果result1。 此外,表达式Lambda的主体还可以包含方法的调用。例如,我们可以在表达式Lambda中调用其他方法,如下所示: ``` func = x => x * Add(3, 2); int result2 = func(5); //[1] ``` 在这个例子中,我们在表达式Lambda中调用了Add方法,并将其结果与输入参数相乘。同样,我们可以通过调用func方法并传入参数5来获得计算结果result2。 总的来说,C#lambda表达式是一种方便而灵活的方式来定义匿名函数,并能简化代码和提高可读性。通过使用lambda表达式,我们可以更加简洁地表示函数逻辑和处理复杂的数据操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C# Lambda表达式](https://blog.csdn.net/qq_39847278/article/details/127525222)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值