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://www.haodehen.cn/did48776