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     }

 

调用方式如下,只需要用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         }

 

第二种方法: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         }

但是上面两种方式都只能对一个实体属性排序,如果对不同的属性排序的话只能写很多的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         }

 

调用方式:

ListSort("Name","desc");//表示对Name进行desc排序

ListSort("Id","asc");//表示对Id进行asc排序。如此如果参数很多的话减少了很多判断。

 

如果有更好的方法欢迎提出,共同学习………..

后续:受一位留言着的提醒,在用反射实现多字段排序时只需一次反射,多余的一次放而会影响性能,现更新如下:

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 t = typeof(Info);

12                             PropertyInfo pro = t.GetProperty(field);

13                             return rule.ToLower().Equals("asc") ?

14                                 pro.GetValue(info1, null).ToString().CompareTo(pro.GetValue(info2, null).ToString()) :

15                                 pro.GetValue(info2, null).ToString().CompareTo(pro.GetValue(info1, null).ToString());

16                         });

17                     Console.WriteLine("*****ListSort**********");

18                     foreach (var item in infoList)

19                     {

20                         Console.WriteLine(item.Id + "," + item.Name);

21                     }

22                 }

23                 catch (Exception ex)

24                 {

25                     Console.WriteLine(ex.Message);

26                 }

27             }

28             else

29                 Console.WriteLine("ruls is wrong");

30         }

 

感谢xujif的提醒。

你可能感兴趣的:(list排序)