码迷,mamicode.com
首页 > Windows程序 > 详细

c# 正则表达式

时间:2015-08-07 11:40:35      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

    很久之前,买了一本叫做《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;});


}

采用正则表达式的好处在于,使用匿名的方式传递参数,很灵活多变,已经没有必要去重新定义方法名,修饰符的麻烦。是委托机制和匿名函数的一直结合体。使用极其简单易读。







c# 正则表达式

标签:

原文地址:http://my.oschina.net/RabbitXiao/blog/488917

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!