C# list排序的三种实现方法

原文地址:http://www.cnblogs.com/bradwarden/archive/2012/06/19/2554854.html

首先先介绍一下平时最常用的几种排序方法。

第一种:实体类实现IComparable接口,而且必须实现CompareTo方法

实体类定义如下:

 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进行排序。

 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接口,调用方式如下:

 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进行判断,这样显得很麻烦。

且看下面的方式实现根据传入参数进行排序。

 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排序。如此如果参数很多的话减少了很多判断。

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

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

 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         }
时间: 2024-11-05 14:56:09

C# list排序的三种实现方法的相关文章

PHP开发之递归算法的三种实现方法

递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你了解掌握了这个算法原理,就可以灵活运用递归算法实现编程中的多种功能比如实现无限分类等.递归也是入门者最需要掌握的一个基础算法技巧.下面就通过具体代码示例为大家介绍PHP递归算法也是PHP递归排序的三种实现方法. 方法一:静态变量 <?phpfunction call(){static $i=1;ec

排序——冒泡排序(三种方法)

冒泡排序的基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒.即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 关于程序中4中冒泡排序写法的说明: bubble_sort1:基本的冒泡排序的写法. bubble_sort2:基本冒泡排序的不同写法,基本的冒泡排序是每次遍历,每次缩小范围1,这种办法是每次正向和反向遍历,每次缩小范围2,所以两者的比较次数也是一样的. bubble_sort

C#使用DataSet Datatable更新数据库的三种实现方法

本文以实例形式讲述了使用DataSet Datatable更新数据库的三种实现方法,包括CommandBuilder 方法.DataAdapter 更新数据源以及使用sql语句更新.分享给大家供大家参考之用.具体方法如下: 一.自动生成命令的条件 CommandBuilder 方法 a)动态指定 SelectCommand 属性 b)利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand.InsertCommand 和 UpdateCommand

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容

android开发中监听器的三种实现方法(OnClickListener)

Android开发中监听器的实现有三种方法,对于初学者来说,能够很好地理解这三种方法,将能更好地增进自己对android中监听器的理解. 一.什么是监听器. 监听器是一个存在于View类下的接口,一般以On******Llistener命名,实现该接口需要复写相应的on****(View v)方法(如onClick(View v)). 二.监听器的三种实现方法 (以OnClickListener为例) 方法一:在Activity中定义一个内部类继承监听器接口(这里是OnClickListener

js oop中的三种继承方法

JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方法.(继承的两方,发生在两个类之间)> 一.通过object实现继承 1:定义父类 function Parent(){} 2:定义子类 funtion Son(){} 3:通过原型给Object对象添加一个扩展方法. Object.prototype.customExtend = function(p

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析 Android中数据存储有5种方式: [1]使用SharedPreferences存储数据 [2]文件存储数据 [3]SQLite数据库存储数据 [4]使用ContentProvider存储数据 [5]网络存储数据 在这里我只总结了三种我用到过的或即将可能用到的三种存储方法. 一.使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基

Jquery中each的三种遍历方法

Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(data) { $.each(data, function(n,value) { });}); 1.选择器+遍历 $('div').each(function (i){ i就是索引值 this 表示获取遍历每一个dom对象 }); 2.选择器+遍历 $('div').each(function (index,dom

Java中Map的三种遍历方法

Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历. 告诉您们一个小秘密: (下↓面是测试代码,最爱看代码了,啰嗦再多也没用) 一般人我不告诉他哦. import java.util.*; //0 我的Main界面 public class MapTraverse { public static void main(String[] args) { String[] str = {"I love you