委托-匿名方法-lambda表达式

使用Delegate的时候很多时候没必要使用一个普通的方法,因为这个方法只有这个Delegate会用,并且只用一次,这时候使用匿名方法最合适。
匿名方法就是没有名字的方法。

 MyDelegate p = delegate(int s) { s = 10; };

在IL中编译器是给匿名方法生成了名字的

      Action<int> a1 = delegate(int i) { Console.WriteLine(i); };

匿名方法最大的作用,是用来推导出lambda表达式

lambda表达式

函数式编程,在Entity framework编程中用的很多
*=>*读作goes to

 //lambda表达式格式的匿名方法的写法
            Action<int> a2 = (int i) => { Console.WriteLine(i); };
            Action<int> a3 = (i) => { Console.WriteLine(i); };
            //如果只有一个参数,可以不写括号
            Action<int> a4 = i => { Console.WriteLine(i); };


            a1(6);
            //Func<string, int, bool> f1 = delegate(string s, int i) { return true; };
            //Func<string, int, bool> f2 = (string s, int i) => { return true; };
            //Func<string, int, bool> f3 = (s, i) => { return true; };
            只有一行代码且为返回值,可以省略方法体和return;
            //Func<string, int, bool> f4 = (s, i) => true;




            Func<int, int> f1 = delegate(int i) { return i * 2; };
            Func<int, int> f2 = (int i) => { return i * 2; };
            Func<int, int> f3 = i => i * 2;
            int j = f3(5);
            Console.WriteLine(j);

普通匿名类型也是一样用lambda表达式

lambda表达式改造GetMax

举个栗子

   class Program
    {
        static void Main(string[] args)
        {
            int[] nums = new int[] { 1, 3, 55, 66 };
            //int m = GetMax(nums, compereInt);

            //1
            //Func<int, int, bool> f = delegate(int i1, int i2) { return i1 > i2; };
            //int m = GetMax(nums,f);
            //2
            //int m = GetMax(nums, delegate (int i1,int i2){ return i1 > i2;});
            //3
            //int m = GetMax(nums, (i1, i2) => { return i1 > i2; });

            Person[] Persons = new Person[] { new Person("baidu", 8), new Person("sina", 9), new Person("qq", 10) };


            Person p = GetMax(Persons, (p1, p2) => p1.Age > p2.Age);


            Console.WriteLine(p);
            Console.ReadKey();
        }
        static bool compereInt(int i1, int i2)
        {
            return i1 > i2;
        }
        static T GetMax<T>(T[] objs, Func<T, T, bool> compereFunc)
        {
            T max = objs[0];
            for (int i = 1; i < objs.Length; i++)
            {
                if (compereFunc(objs[i], max))//调用func指向的方法,判断谁大,写这段代码的人也不知道func指向哪个方法,只知道func指向的方法有两个object 参数一个bool返回值
                    max = objs[i];
            }
            return max;
        }

        class Person
        {
            public Person(string name, int age)
            {
                this.Name = name;
                this.Age = age;
            }
            public int Age { get; set; }
            public string Name { get; set; }
            public override string ToString()
            {
                return "name=" + Name + ";age=" + Age;
            }

        }

    }

展开和简化都要有个过程,牢记。

创建MyWhere

static class JiHeExt
    {
        public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> data, Func<T, bool> func)
        {
            //foreach() 什么样的对象可以使用foreach遍历:实现了IEnumerabal接口
            //List,数组等都实现了IEnumerable
            List<T> resultList = new List<T>();
            foreach (T item in data)
            {
                if (func(item))//遍历到的这条数据是否满足条件func
                {
                    resultList.Add(item);
                }
               
            }
            return resultList;
        }
    }

调用

 static void Main(string[] args)
        {

            //int[] nums = new int[] { 3,5,8,10,12,13,15,17};

            //IEnumerable<int> r1 = nums.MyWhere(i => i > 10);//delegate(int){return i>10;};
            //IEnumerable<int> r1 = nums.MyWhere(i => i%2==0);//delegate(int){return i>10;};
            //foreach (int item in r1)
            //{
            //    Console.WriteLine(item);
            //}


            string [] nums = new string[] {"思宇","老耿","老孙","阿森"};
            IEnumerable<string> r1 = nums.MyWhere(s=>s.Contains("老"));
          
            foreach (string item in r1)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值