• 一步步理解Lambda表达式


    1.泛型方法的简化

           public static void WL<T>(T input)
            
    {
                Console.WriteLine(input);
            }

      调用:

          int a = 100;
               WL
    <int>(a);
            WL(a);
         
    //C#的编辑器会通过调用WL的方法获取参数类型,所以不要把泛型类型赋予方法

    2.泛型委托:
    先定义个泛型委托Del 

     public delegate void Del<T>(T item);
            
    public static void WL<T>(T input)
            
    {
                Console.WriteLine(input);
            }

       
    int a = 100;
                
    int b = 200;
                
    int c = 300;
              
    //  Del<int> m1 = new Del<int>(WL<int>); //效果同下行 ,可不必传给方法类型(见1)
                Del<int> m1 = new Del<int>(WL);
       
    //匿名委托
                Del<int> m2 = delegate(int input)
                
    {
                    Console.WriteLine(input);
                }
    ;
                
    //再进一步,C#2.0方法组转换的新功能,适用于具体委托类型和泛型委托类型
                Del<int> m3 = WL;
                m1(a);
                m2(b);
                m3(c);

     3.Lambda表达式和扩展方法
     如下:

              IList<int> list = new List<int>();
                list.Add(
    4);
                list.Add(
    5);
                list.Add(
    6);
                var mylist 
    = list.Where(i=> i > 5);
                
    foreach (var item in mylist)
                
    {
                    Console.WriteLine(item);  
                }

       前提,如果你知道  i=>i>5 其实表示一个委托,
       类似这样的委托

                delegate(int input)
                
    {
                    
    return input>5;
                }
    ;

    然后记住这种玩意就是个委托,那么继续:  
      构造一个扩展方法:(Del是前面定义的泛型委托,扩展方法的语法假定你也知道)

       public static void Ext<T>(this T source, Del<T> D)
            
    {
                D(source);
            }

      
    //a.Ext<int>(m1); //原因如1中所述
      a.Ext(m1);//就是个委托
            a.Ext(i => Console.WriteLine(i)); //试试这个.然后再尝试理解LINQ命名空间里的其他方法

    测试代码:

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

    namespace ConsoleApplication1
    {
        
    //扩展方法必须定义在静态的类中
        public static class Program
        
    {
            
    public delegate void Del<T>(T item);
            
    public static void WL<T>(T input)
            
    {
                Console.WriteLine(input);
            }

            
    public static void Ext<T>(this T source, Del<T> D)
            
    {
                D(source);
            }

            
    static void Main(string[] args)
            
    {
                
    int a = 100;
                
    int b = 200;
                
    int c = 300;
              
    //  Del<int> m1 = new Del<int>(WL<int>); //效果同下行 
                Del<int> m1 = new Del<int>(WL);
                Del
    <int> m3 = delegate(int input)
                
    {
                    Console.WriteLine(input);
                }
    ;
                
    //C#2.0方法组转换的新功能,适用于具体委托类型和泛型委托类型
                Del<int> m2 = WL;
                m1(a);
                m2(b);
                m3(c);
                
    //a.Ext<int>(m1);
                a.Ext(m1);
                a.Ext(i 
    => Console.WriteLine(i));
               
            }

        }

    }

    以上是个人理解
      

  • 相关阅读:
    uniq 只能相邻行去重
    uniq 只能相邻行去重
    uniq 只能相邻行去重
    KVO(1)
    KVO(1)
    KVO(1)
    KVO(1)
    解决 Retrofit 多 BaseUrl 及运行时动态改变 BaseUrl ?
    jquery 请求成功后
    事故现场:MySQL 中一个双引号的错位引发的血案
  • 原文地址:https://www.cnblogs.com/solo/p/1168981.html
Copyright © 2020-2023  润新知