标签:
很久之前,买了一本叫做《c#本质论》的砖头书,前前后后啃了差不多一年了。终于看完了。总体来说对很多编程机制和用法有了一个大致的了解。如今学习的越多,越来越觉得基础真的很重要,是复杂结构的基础。近些天重新拾起这本书,温习了一下委托的概念。又有深入的体会。现记载如下,以供以后自己查看方便他人学习。
本文主题是有关正则表达式,但是要谈这个主题,得先谈谈它的根源,那就是委托的概念。随着创建的类越来越多,你会发现类和类的关系存在着一些常见的模式。一种常见的模式是向方法传递对象,该方法在调用对象的一个方法。例如,向方法传递一个IComparer<int>引用,被调用的方法本身可以在提供的对象上调用compare()方法。在这种情况下,接口的作用只是向最终被调用的方法传递一个引用。所以,似乎不需要每次传递一个方法时都定义新接口。而委托恰好解决了一样的一种模式。按照我的理解,所谓的委托类型,就是所谓的传递方法的类型。就是字符串要用string,整型要用int是一样的。
举个例子来说明委托的使用方法
利用冒泡法实现多种要求下的排序功能:
//当不使用委托的时候 static class simplesort { public enum SortType { Ascending,Descending } public static void BubbleSort(int [] items,SortType sortorder) { int i,j,temp; if(items==null){ return; } for(i=items.length-1;i>=0;i--) { for(j=1;j<=i;j++) { bool swap=false; //这里的switch语句就实现了升序和降序功能。 switch(sortorder) { case SortTpye.Ascending:swap=items[j-1]>items[j]; break; case SortType.Descending: swap=items[j-1]<items[j]; break; } if(swap) { temp=items[j-1]; items[j-1]=items[j]; items[j]=temp; } } } } }
然而即使使用switch不是一个十分方便的事。因为当你的需要按要求排序的种类越多时,整个switch语句就变得非常长,更重要的是,一旦在一个方法里面,代码太长,就很不方便管理了。多种方式可能出现相互牵连和杂糅,关系不清的情况。很不方便管理。于是我就开始想,不管在这个冒泡法里面,想要实现升序排序还是降序排序还是字典方式排序等等,如果我们将switch部分,单独剥离出来,会不会更好呢。我们可以将不同形式的排序方式分别写成多个方法,通过向BubbleSort方法传递方法参数(也就是委托)来确定使用哪一种排序,这样就可以很好避免BubbleSort方法过于冗长不变管理和阅读。
为了增加灵活性和减少重复代码,可以创建一个委托作为BubbleSort()的一个参数。调用时,将我们先要实现的排序方式的方法传进去就可以了。以上代码就可以修改成这样:
//使用委托后的代码,更加灵活 public delegate bool CompareMethod (int x,int y);//申明委托 static class simplesort { public enum SortType { Ascending,Descending } public static void BubbleSort(int [] items,CompareMethod compare) { int i,j,temp; if(items==null){ return; } for(i=items.length-1;i>=0;i--) { for(j=1;j<=i;j++) { if(compare(items[j-1],items[j])) { temp=items[j-1]; items[j-1]=items[j]; items[j]=temp; } } } } bool CompareMethod1(int x,int y){ return x>y; } bool CompareMethod2(int x,int y){ return x<y; } } //主函数里我们根据需要调用CompareMethod1 还是CompareMethod2. void main(string [] args){ int [] items={3,7,8,4,90,87,59}; //如果我们想用升序的方式排序 BubbleSort(items,new CompareMethod(CompareMethod1); //当然上面的语句,我们也可以简写成这样的 //BubbleSort(items,CompareMethod1); //如果我们想用降序方式排序 //BubbleSort(items,new CompareMethod(CompareMethod); }
以上是对委托的使用,然而为了引进更加精简的方式,来传递方法,我们引入了匿名函数,正则表达式Lambda。
分类:Lambda表达式分为两类:一。语句Lambda 二.表达式Lambda.两者区别很简单。语句Lambda是一个语句块。而表达式Lambda是一行语句,仅是一个表达式。
格式:(类型1 参数1,类型2 参数2,类型3 参数3,。。。)=>{ ...语句块或是表达式 }。
对于上面利用委托来实现升降序时,我们就没有必要写两个方法(comparemethod1()和comparemethod2())来实现其功能了。因为有一种更加省事的方法,直接使用Lambda表达式,进行匿名传递给BubbleSort()来达到我们想要的排序。
代码如下:
//使采用正则表达式 public delegate bool CompareMethod (int x,int y);//申明委托 static class simplesort { public enum SortType { Ascending,Descending } public static void BubbleSort(int [] items,CompareMethod compare) { int i,j,temp; if(items==null){ return; } for(i=items.length-1;i>=0;i--) { for(j=1;j<=i;j++) { if(compare(items[j-1],items[j])) { temp=items[j-1]; items[j-1]=items[j]; items[j]=temp; } } } } bool CompareMethod1(int x,int y){ return x>y; } bool CompareMethod2(int x,int y){ return x<y; } } //主函数里我们根据需要调用CompareMethod1 还是CompareMethod2. void main(string [] args){ int [] items={3,7,8,4,90,87,59}; //如果我们想用升序的方式排序 BubbleSort(items,(int x,int y)=>{return x>y;}); }
采用正则表达式的好处在于,使用匿名的方式传递参数,很灵活多变,已经没有必要去重新定义方法名,修饰符的麻烦。是委托机制和匿名函数的一直结合体。使用极其简单易读。
标签:
原文地址:http://my.oschina.net/RabbitXiao/blog/488917