从ArrayList.sort到List.sort看dotnet1.1到dotnet3.5的演变!

  如果要在下面中要你对集合数据进行排序,在dotnet1.1中我们可以使用list.sort,有两种方法,

public   void  List.Sort();
public   void  List.Sort(IComparer);

他们的区别在前面我那篇英文的文章中写的很清楚了。在什么情况下用那种,我这里就用文章中说到的第二种。

class  Student   
{
     
private   int  age;
     
private   string  name;
     
public  Student( int  age, string  name)
     {
        
this .age  =  age;
        
this .name  =  name;
     }
     
public   int  Age
     {
          
get
          {
            
return  age;
          }
          
set
          {
            
this .age  =  value;
          }
     }
     
public   string  Name
     {
         
get
         {
            
return  name;
          }
         
set
          {
            
this .name  =  value;
          }
      }
}
public   class  StudentComparer : IComparer
{
       
public   int  Compare( object  x,  object  y)
       {
            Student left 
=  x  as  Student();
            Student right 
=  y  as  Student();
            
return  left.age.CompareTo(right.age);
       }
}

然后使用:

   ArrayList arr  =   new  ArrayList();
   arr.add(
new  Student( 18 , " zhang1 " ));
   arr.add(
new  Student( 17 , " zhang1 " ));
   arr.add(
new  Student( 18 , " zhang1 " ));
   arr.sort(
new  StudentComparer());

搞定。但我想更灵活点,写个方法让你可以有选择的进行升序和降序

   public   void  SortByStudentAge(List Student,  bool  ascending)
  {
      List.sort(
new  StudentComparer(ascending));
  }

这样就灵活了。但是上面的类还要改。

    public   class  StudentComparer : IComparer
   {
       
private   bool  ascending;
       
public  StudentComparer( bool  ascending)
       {
           
this .ascending  =  ascending;
       }
       
public   int  Compare( object  x,  object  y)
       {
            Student left 
=  x  as  Student();
            Student right 
=  y  as  Student();
            
return  left.age.CompareTo( right.age )  *  ( ascending  ?   1  :  - 1 );
       }
   }

好了dotnet1.1版本的实现了,路漫漫其修远兮。有点不想写了,坚持。qq zone真不爽,不支持高亮,我明天去博客园申请个博客。我这代码是qq zone里直接写的,不能完全保证编译通过。
       接下来就到dotnet2.0的功能部分了。激动人心,几乎颠覆传统思想。要抗住,技术几年换一代。所以说要把基础打好(美国当今成熟一代程序员,都是看懂LINUX源代码,算法和基本功很过硬的,所以他们不说别的,新技术到手上,可以很快消化。而作为半路上来做程序员的你,你就要思考了),废话不说了,开始

public   void  List < T > .Sort();
public   void  List < T > .Sort(Comparison < T > );
public   void  List < T > .Sort(IComparer < T > );
public   void  List < T > .Sort(Int32, Int32, IComparer < T > );

四个重载,同时都是泛型的。
第一个和第三个重载跟上面说道的dotnet 1.1的那两个一样,只是泛型版本而已。不说了。
现在我主要展示第二个。
我同样实现上面的学生类排序

   class  Student   {
     
private   int  age;
     
private   string  name;
     
public  Student( int  age, string  name)
     {
        
this .age  =  age;
        
this .name  =  name;
     }
     
public   int  Age
     {
          
get
          {
            
return  age;
          }
          
set
          {
            
this .age  =  value;
          }
     }
     
public   string  Name
     {
         
get
         {
            
return  name;
          }
         
set
          {
            
this .name  =  value;
          }
      }
   }

这个类不变。照抄。
接下来写排序方法,支持升序和降序
Comparison是个泛型委托,我定义个排序方法给它。

   public   static   int  Compare(Student a, Student b) // 在dotnet 2.0这个方法名可以随便
  {
        
return  (a.Age  -  b.Age);
  }

  
public   void  SortByStudentAge(List < Student >  Student,  bool  ascending)
  {
      List
< Student > .sort(Comparison < Student > (Compare));
  }

搞定但是这样还不支持动态切换升序和降序,我必须把ascending,传递给Compare方法,但是它是委托的函数,我不能给它加参数。所以我只能给它定义个类来传递参数。

public   class  StudentComparer
{
  
private   bool  ascending;
  
public  StudentComparer( bool  ascending)
  { 
   
this .ascending  =  ascending;
  }
    
public   int  Compare(Student a, Student b) // 在dotnet 2.0这个方法名可以随便
  {
        
return  (a.Age  -  b.Age) * (ascending ? 1 : - 1 );
  }
}

接下来使用

   public   void  SortByStudentAge(List < Student >  Student,  bool  ascending)
  {
      StudentComparer stuComp 
=   new  StudentComparer(ascending);
      List
< Student > .sort(Comparison < Student > (stuComp.Compare));
  }

搞定,但是没实现一种排序就要多写一个类,想死。而且在dotnet2.0 写类仅仅是为了传一个参数而已 。dotnet1.1只能是写类。
     dotnet3.5的写法,那真的是春天来了。体现出动态语言优点和简洁。

    class  Student   
   {
     
public   int  Age
     {
       
get ; set ;
     }
     
public   string  Name
     {
       
get ; set ;
     }
   }

接下来就是支持升序和降序的排序了。

public   void  SortByStudentAge(List < Student >  Student,  bool  ascending)
  {
      List
< Student > .sort((a ,b ) => ( a.Age  -  b.Age )  *  ( ascending  ?   1  :  - 1 ));  // Lambda表达式
  }

当然,我们还可以用Dotnet3.5的linq实现排序,那更简单更快。

            var list  =   new  List < Student >
            {
                
new  Student{Age = 28 ,Name = " ZHANGSAN " },
                
new  Student{Age = 18 ,Name = " Lisi " },
                
new  Student{Age = 23 ,Name = " Wangwu " }
            };
            var res 
=  list.OrderByDescending(S  =>  S.Age).GetEnumerator(); // 降序
            
// 升序 var res = list.OrderBy(S => S.Age).GetEnumerator();
             while  (res.MoveNext())
            {
                Console.WriteLine(res.Current.Age 
+   "   "   +  res.Current.Name);
            }

搞定,呵呵。不用怕,要有开放的编程思想,如果你不能接受,就只能淘汰。写多了js的伪oop或者python ruby,那么自然也就习惯了。写累了。。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值