c# list排序的三种实现方式
c# list排序的三种实现方式
用了一段时间的gridview,对gridview实现的排序功能比较好奇,而且利用C#自带的排序方法只能对某一个字段进行排序,今天demo了一下,总结了三种对list排序的方法,并实现动态传递字段名对list进行排序。
首先先介绍一下平时最常用的几种排序方法。
第一种:实体类实现IComparable接口,而且必须实现CompareTo方法
实体类定义如下:
View Code
 1   class   Info:IComparable
   2       {
   3           public   int  Id {  get ;  set  ; }
   4           public   string  Name {  get ;  set  ; }
   5  
  6           public   int  CompareTo( object   obj) {
   7               int   result;
   8               try 
  9               {
  10                  Info info = obj  as   Info;
  11                   if  ( this .Id >  info.Id)
  12                   {
  13                      result =  0  ;
  14                   }
  15                   else 
 16                      result =  1  ;
  17                   return   result;
  18               }
  19               catch  (Exception ex) {  throw   new   Exception(ex.Message); }
  20           }
  21      }
  1   class   Info:IComparable
   2       {
   3           public   int  Id {  get ;  set  ; }
   4           public   string  Name {  get ;  set  ; }
   5  
  6           public   int  CompareTo( object   obj) {
   7               int   result;
   8               try 
  9               {
  10                  Info info = obj  as   Info;
  11                   if  ( this .Id >  info.Id)
  12                   {
  13                      result =  0  ;
  14                   }
  15                   else 
 16                      result =  1  ;
  17                   return   result;
  18               }
  19               catch  (Exception ex) {  throw   new   Exception(ex.Message); }
  20           }
  21      }
调用方式如下,只需要用sort方法就能实现对list进行排序。
View Code
 1   private   static   void   ReadAccordingCompare() {
   2              List<Info> infoList =  new  List<Info> ();
   3               infoList.Add(
   4                   new  Info() { Id =  1 , Name =  "  abc  "   });
   5              infoList.Add( new  Info() { Id =  3 , Name =  "  rose  "   });
   6              infoList.Add( new  Info() { Id =  2 , Name =  "  woft  "   });
   7                  infoList.Sort();
   8               foreach  ( var  item  in   infoList)
   9               {
  10                  Console.WriteLine(item.Id +  "  :  "  +  item.Name); 
  11               }
  12          }
  1   private   static   void   ReadAccordingCompare() {
   2              List<Info> infoList =  new  List<Info> ();
   3               infoList.Add(
   4                   new  Info() { Id =  1 , Name =  "  abc  "   });
   5              infoList.Add( new  Info() { Id =  3 , Name =  "  rose  "   });
   6              infoList.Add( new  Info() { Id =  2 , Name =  "  woft  "   });
   7                  infoList.Sort();
   8               foreach  ( var  item  in   infoList)
   9               {
  10                  Console.WriteLine(item.Id +  "  :  "  +  item.Name); 
  11               }
  12          }
第二种方法:linq to list进行排序
运用linq实现对list排序,在实体类定义的时候就不需用实现IComparable接口,调用方式如下:
View Code
 1   private   static   void  ReadT( string   str) {
   2              List<Info> infoList =  new  List<Info> ();
   3               infoList.Add(
   4                   new  Info() { Id =  1 , Name =  "  woft  "   });
   5              infoList.Add( new  Info() { Id= 3 ,Name= "  rose  "  });
   6              infoList.Add( new  Info() { Id =  2 , Name =  "  abc  "   });
   7              Console.WriteLine( "  ReadT*********************  "  );
   8              IEnumerable<Info> query =  null  ;
   9              query =  from  items  in  infoList  orderby  items.Id  select   items;
  10               foreach  ( var  item  in   query)
  11               {
  12                  Console.WriteLine(item.Id+ "  :  " + item.Name);
  13               }
  14          }
  1   private   static   void  ReadT( string   str) {
   2              List<Info> infoList =  new  List<Info> ();
   3               infoList.Add(
   4                   new  Info() { Id =  1 , Name =  "  woft  "   });
   5              infoList.Add( new  Info() { Id= 3 ,Name= "  rose  "  });
   6              infoList.Add( new  Info() { Id =  2 , Name =  "  abc  "   });
   7              Console.WriteLine( "  ReadT*********************  "  );
   8              IEnumerable<Info> query =  null  ;
   9              query =  from  items  in  infoList  orderby  items.Id  select   items;
  10               foreach  ( var  item  in   query)
  11               {
  12                  Console.WriteLine(item.Id+ "  :  " + item.Name);
  13               }
  14          }
但是上面两种方式都只能对一个实体属性排序,如果对不同的属性排序的话只能写很多的if进行判断,这样显得很麻烦。
且看下面的方式实现根据传入参数进行排序。
View Code
 1   private   static   void  ListSort( string  field, string   rule)
   2           {
   3               if  (! string .IsNullOrEmpty(rule)&&(!rule.ToLower().Equals( "  desc  " )||!rule.ToLower().Equals( "  asc  "  )))
   4               {
   5                   try 
  6                   {
   7                      List<Info> infoList =  GetList();
   8                       infoList.Sort(
   9                           delegate  (Info info1, Info info2)
  10                           {
  11                              Type t1 =  info1.GetType();
  12                              Type t2 =  info2.GetType();
  13                              PropertyInfo pro1 =  t1.GetProperty(field);
  14                              PropertyInfo pro2 =  t2.GetProperty(field);
  15                               return  rule.ToLower().Equals( "  asc  " ) ?
 16                                  pro1.GetValue(info1,  null ).ToString().CompareTo(pro2.GetValue(info2,  null  ).ToString()) :
  17                                  pro2.GetValue(info2,  null ).ToString().CompareTo(pro1.GetValue(info1,  null  ).ToString());
  18                           });
  19                      Console.WriteLine( "  *****ListSort**********  "  );
  20                       foreach  ( var  item  in   infoList)
  21                       {
  22                          Console.WriteLine(item.Id +  "  ,  "  +  item.Name);
  23                       }
  24                   }
  25                   catch   (Exception ex)
  26                   {
  27                       Console.WriteLine(ex.Message);
  28                   }
  29              } Console.WriteLine( "  ruls is wrong  "  );
  30  
 31          }
  1   private   static   void  ListSort( string  field, string   rule)
   2           {
   3               if  (! string .IsNullOrEmpty(rule)&&(!rule.ToLower().Equals( "  desc  " )||!rule.ToLower().Equals( "  asc  "  )))
   4               {
   5                   try 
  6                   {
   7                      List<Info> infoList =  GetList();
   8                       infoList.Sort(
   9                           delegate  (Info info1, Info info2)
  10                           {
  11                              Type t1 =  info1.GetType();
  12                              Type t2 =  info2.GetType();
  13                              PropertyInfo pro1 =  t1.GetProperty(field);
  14                              PropertyInfo pro2 =  t2.GetProperty(field);
  15                               return  rule.ToLower().Equals( "  asc  " ) ?
 16                                  pro1.GetValue(info1,  null ).ToString().CompareTo(pro2.GetValue(info2,  null  ).ToString()) :
  17                                  pro2.GetValue(info2,  null ).ToString().CompareTo(pro1.GetValue(info1,  null  ).ToString());
  18                           });
  19                      Console.WriteLine( "  *****ListSort**********  "  );
  20                       foreach  ( var  item  in   infoList)
  21                       {
  22                          Console.WriteLine(item.Id +  "  ,  "  +  item.Name);
  23                       }
  24                   }
  25                   catch   (Exception ex)
  26                   {
  27                       Console.WriteLine(ex.Message);
  28                   }
  29              } Console.WriteLine( "  ruls is wrong  "  );
  30  
 31          }
调用方式:
ListSort( " Name " , " desc " ); // 表示对Name进行desc排序 ListSort( " Id " , " asc " ); // 表示对Id进行asc排序。如此如果参数很多的话减少了很多判断。
如果有更好的方法欢迎提出,共同学习………..
分类: asp.net
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于c# list排序的三种实现方式的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did48776