zoukankan      html  css  js  c++  java
  • 5语法基础_Lamda,扩展方法,匿名类,linq的使用

    目录:

      1、lambda演变史及其使用

      2、自定义自己的Linq扩展方法

      3、linq就是微软方便开发者在c#快捷的对数据做处理 封装好的一个linq语法

     

    1、lambda演变史及其使用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyLinq
    {
     
        public class LambdaShow
        {
            public delegate void NoReturnNoPara();
            public delegate void NoReturnWithPara(string x, string y);//1 声明委托
            public delegate int WithReturnNoPara();
            public delegate string WithReturnWithPara(out int x, ref int y);
            private void DoNothing()
            {
                Console.WriteLine("This is DoNothing");
            }
    
            private void Study(string x, string y)
            {
                Console.WriteLine("This is Study");
            }
            public void Show()
            {
                //lambda演变历史
                {
                    //.NetFramework1.0/1.1时代 
                    NoReturnNoPara method = new NoReturnNoPara(this.DoNothing);
                    NoReturnWithPara noReturnWithPara = new NoReturnWithPara(this.Study);
                    noReturnWithPara.Invoke("1", "1");
                }
    
                int i = 10;
                {
                    //.NetFramework2.0  匿名方法,增加了一个delgate关键字 可以访问局部变量
                    NoReturnWithPara noReturnWithPara = new NoReturnWithPara(delegate (string x, string y)
                    {
                        Console.WriteLine(i);
                        Console.WriteLine("This is Study");
                    });
                    noReturnWithPara.Invoke("1", "1");
                }
                { 
                    Console.WriteLine("***********************.NetFramework3.0****************************");
                    //.NetFramework3.0  去掉delegate关键字,添加了一个=>  goes to
                    NoReturnWithPara noReturnWithPara = new NoReturnWithPara((string x, string y) =>
                    {
                        Console.WriteLine(i);
                        Console.WriteLine("This is Study");
                    });
                    noReturnWithPara.Invoke("1", "1");
                }
                {
                    NoReturnWithPara noReturnWithPara = new NoReturnWithPara((x, y) => // 通过委托自动推断来的(语法糖)
                    {
                        Console.WriteLine(i);
                        Console.WriteLine("This is Study");
                    });
                    noReturnWithPara.Invoke("1", "1");
                }
                {
                    NoReturnWithPara noReturnWithPara = new NoReturnWithPara((x, y) => Console.WriteLine("This is Study")
                    );
                    noReturnWithPara.Invoke("1", "1");
                }
                {
                    NoReturnWithPara noReturnWithPara = (x, y) => Console.WriteLine("This is Study");
                    noReturnWithPara.Invoke("korey", "杰克");
                }
                {
                    Action<string, string> action = (x, y) => Console.WriteLine($"{x}_{y}");
                    Action<string> action1 = x => Console.WriteLine($"{x}"); // 如果只有一个参数的时候,可以省略小括号 
                    Func<string, string> func = x => "1";  //如果有返回值,而且方法体只有一行,可以省略return; 
    
                    Func<string> func1 = () => "1";  //如果有返回值,而且方法体只有一行,可以省略return;
                }
                //lambda表达式就是什么?
                //其实是一个方法, 在中间语言中,为其分配了一个方法名称;
                // 通过反编译之后,发现Lambda表达式生成在一个名称为<> 密封类中的一个方法; 
    
                {
                    //lambda在多播委托相同lambda表达式 其实生成的是不同的方法名字
                    NoReturnWithPara noReturnWithPara = new NoReturnWithPara(this.Study);
                    noReturnWithPara += this.Study;
                    noReturnWithPara += (x, y) =>
                    {
                        Console.WriteLine($"{x}_{y}");
                    };
                    noReturnWithPara -= this.Study;
                    noReturnWithPara -= (x, y) => { Console.WriteLine($"{x}_{y}"); };  //尽管移除了 但是 还是会输出
                    noReturnWithPara("1", "1");
                    //lambda表达式在多播委托中不能被移除? 
                    // 是的 因为在通过反编译查看的时候 lambda生成的其实是两个不同名字的方法
                       
    
                }
                
            }
    
        
    
        }
    }
    View Code

    2、扩展方法的使用,固定套路:1定义静态类 2静态方法 3第一个参数前使用this

        public static class linqtoSB
        {
            public static void linqToSbs<T>(this List<T> t)
            {
                Console.WriteLine("做自己的扩展方法啊逻辑");
            }
        }
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
    
                List<string> list = new List<string>();
    
                list.linqToSbs(); 
    } 
    } 
    }
    View Code

    3、linq就是微软方便开发者快速对数据做处理 封装好的一个语法

    // Linq To Xml:封装通用对Xml文件的操作,可变的逻辑通过委托来传递
    // Linq To sql:封装通用的sql操作 https://www.cnblogs.com/jara/p/3473996.html不知道怎么写Linq查询看这里

    上面都是通过 扩展方法+委托 把可变的逻辑封装组合  例如 linq.Where(x=>x.id==1

       var list = studentList.Where<Student>(s => s.Age < 30)//条件过滤
                                         .Select(s => new//投影
                                         {
                                             Id = s.Id,
                                             ClassId = s.ClassId,
                                             IdName = s.Id + s.Name,
                                             ClassName = s.ClassId == 2 ? "0" : "1"
                                         })

    同下

       ///如果需要一个方法满足需求,那就是泛型方法
            /// <summary>
            /// 代码重用 
            /// </summary>
            /// <param name="resource"></param>
            /// <returns></returns>
            public static List<T> JerryWhere<T>(this List<T> resource, Func<T, bool> func)
            {
                var list = new List<T>();
                foreach (var item in resource)
                {
                    if (func.Invoke(item)) //  /* if (item.Age < 30)*///bool //item做为一个参数  返回一个bool 
                    {
                        list.Add(item);
                    }
                }
                return list;
            }

    )

  • 相关阅读:
    hdu1180奇怪的楼梯……bfs迷阵……wa该16二级,我太渣滓
    Android新闻案例clientserver达到,完全自己的新闻节目平台
    xcode代码统计行
    linux每个路由表的系统研究
    Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)
    《网络编程》ioctl 操作
    Android framework召回(3)binder使用和IBinder BpRefbase IInterface INTERFACE 之间的关系
    使用关节型
    leetcode 218: The Skyline Problem
    删除依赖命令
  • 原文地址:https://www.cnblogs.com/LZXX/p/13031062.html
Copyright © 2011-2022 走看看