匿名委托+内置委托+Lambda表达式

概要

     在实际开发中,项目开发框架不同,用到的技术是不一样的,这里总结一下用Linq开发,ORM之EF开发会大量使用的Lambda表达式;

正文

     之前提过.Net有一套扩展在IEumberable<T>泛型接口的扩展方法,本文是从这个基础继续总结;

     1.void Action<in T>:

     先拿一个ForEach()来讲:

     public void ForEach(Action<T> action);

     这个Action<T>是.Net的其中一个内置委托,Action<T>的其中一个签名如下:

     public delegate void Action<in T>(T obj);

     这个签名接受一个入参并且没有返回值,这里举一个例子,代码如下:

     //提供一个数据源

     static List<UserInfo> getList()
        {
            List<UserInfo> list = new List<UserInfo>() {
            new UserInfo("Francis",21),
            new UserInfo("Lyfeng",25),
            new UserInfo("Harry",24)
            };
            return list;
        }

    //面向对象编程

    class UserInfo
    {
        private int age;

        public int Age
        {
            get { return age; }
            set { age = value; }
        }
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public UserInfo(string name,int age)
        {
            this.name = name;
            this.age = age;
        }
        public override string ToString()
        {
            return "姓名:" + this.name + " 年龄:" + this.Age;
        }
    }

    根据这个Action<T>的签名定义,来一个自定义方法myAction(UserInfo user):

      在main函数中写两句代码:

        var list = getList();
        list.ForEach(myAction);

    结果:

   接下来,使用匿名委托来取代myAction,如下图:

    再接下来,由匿名委托到Lambda表达式:

  

   2.bool Predicate<in T>

   再拿一个FindAll()来讲:

   public List<T> FindAll(Predicate<T> match);

   Predicate是.Net的另一个内置委托,其中一个重载签名如下:

   public delegate bool Predicate<in T>(T obj);

   这个重载返回值为bool,接受一个入参,接下来自定义一个myPredicate(UserInfo user)

  

    使用匿名委托实现:

   

     由匿名委托到Lambda表达式:

  

     3.TResult Func<in T, out TResult>

       拿Where()来讲,这是一个扩展至IEnumerable<TSource>的扩展方法:

      public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,

                        Func<TSource, bool> predicate);

      Func<in T, out TResult>是.Net的另一个常用内置委托,其中一个签名如下:

       public delegate TResult Func<in T, out TResult>(T arg);

       这个签名接受一个入参,返回值为TResult,即不固定的,下面以返回bool表示:

         4.int Comparison<in T>(T x, T y)

       拿Sort()来讲,签名如下

       public void Sort(Comparison<T> comparison);

       Comparison<T>是.Net的其中一个内置委托,其中签名如下:

       public delegate int Comparison<in T>(T x, T y);

       返回值int,两个一样的入参:

      

 

 

   结束!

 

posted on 2015-09-02 12:56  巴夫巴夫  阅读(251)  评论(0编辑  收藏  举报