zoukankan      html  css  js  c++  java
  • 脚踏实地学C#5-扩展方法

    扩展方法(Extension Method)

             MSDN定义:能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

            扩展方法须知: 1、扩展方法声明所在的类必须被声明为static

                                     2、扩展方法必须被声明为static

                                     3、扩展方法必须包含this关键字作为它的第一个参数类型,并后跟所扩展的类的名称

    创建扩展方法

    //通过扩展方法 创建一个类似List FindAll方法
    namespace Blog_ExtensonMethod
    {
        //静态类
        public static class ExtensionMethods
        {   //声明一个委托(本次不是重点,后面介绍委托和事件) 
            public delegate bool MyCalcDelegate<in T>(T obj);
            //静态方法
            //第一版本        
            public static List<T> ScreenValueList<T>(this List<T> list, MyCalcDelegate<T> myCalc) //this关键字 后跟类型
            {
                List<T> reslut = new List<T>();
                foreach (var item in list)
                {
                    if (myCalc(item))
                    {
                        reslut.Add(item);
                    }
                }
                return reslut;
            }
            //第二版本
            public static List<T> ScreenValue<T>(this List<T> list, Func<T, bool> whereLambda)
            {
                return list.Where(whereLambda).ToList();
            }
        }
    }
    namespace Blog_ExtensonMethod
    {    
        class Program
        {
            static void Main(string[] args)
            {
                //list初始化数据
                List<int> list = new List<int>();
                for (int i = 0; i < 100; i++)
                {
                    list.Add(i);
                }
    
                //ScreenValueList(筛选数据)创建步骤
                //1.创建扩展方法(静态类、静态方法、this关键字+类型)
                //1.1 创建一个委托(委托可以简单理解将方法像参数一样可以进行传递)
                //2.方法内 创建一个新的泛型List
                //3.方法内 将MyCalc方法(判断list中的单个值是否大于50,如果大于就添加到新的泛型List中)
                //4.方法内 将新的泛型List返回
    
                //第一版本
                var temp = list.ScreenValueList(MyCalc);  //将MyCalc方法传入ScreenValueList方法中返回List循环打印
                foreach (var item in temp)
                {
                    Console.WriteLine(item);
                }
    
                Console.WriteLine("=======================");
    
                //第二版本 和FindAll差不多了
                  var tmp = list.ScreenValue(i => i > 50);
                foreach (var item in tmp)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
            }
    
            public static bool MyCalc(int val)
            {
                return val > 50;
            }
        }
    }                               

             其实很多的时候我们都在用扩展方法,只是没认真注意,如Linq中的方法,Where、OrderBy等,犹如MVC中HtmlHelper添加符合我们方法,那绝对是堪比服务端控件的利器,而又没有viewstate!

    扩展方法其实只要记得三要素:静态类、静态方法、this关键字

  • 相关阅读:
    Oracle 多表查询优化
    FZU 2150 Fire Game
    HDU 1058 Humble Numbers
    UVA 11624 Fire!
    POJ 1321 棋盘问题
    线性表的基本操作
    POJ 3414 Pots(广搜输出路径)
    HDU 1495 非常可乐
    POJ 1847 Tram
    POJ 3159 Candies(查分约束)
  • 原文地址:https://www.cnblogs.com/qq0827/p/3347784.html
Copyright © 2011-2022 走看看