在日常编写程序的时候,我们需要对一些对象进行排序,比如对int数组进行排序,自定义类数组进行排序,首先我们先讨论对数组进行排序,我们应该对冒泡排序比较熟悉,下面是数组用冒泡排序的方法

for (int i = 0; i < sortArry.Length; i++)
{
for (int j = sortArry.Length - 1; j > i; j--)
{
if (sortArry[i] < sortArry[j])
{
int temp = sortArry[i];
sortArry[i] = sortArry[j];
sortArry[j] = temp;
}
}
}

  上面这段代码非常适用于int型数组排序,但是如果我们希望对任何对象排序应该怎么办?如果我们定义了一个自定义实体类数组,我们需要对这个实体类的对象进行排序,我们就不能用sortArry[i] < sortArry[j]的方法来进行排序了,但是我们仔细想一想,自定义类默认情况下是不能用“<”运算符进行比较的。接下来我要说的就是,虽然不能直接用比较运算符进行比较,但是我们可以在类里面实现用某一字段的比较来实现对象与对象之间的比较。

  下面的例子我们创建了一个Employee类,类里面顶一个通过比较Salary的方法来进行Employee对象与对象之间的比较。在类Objectsort中,我们用泛型方法sort<T>来实现冒泡排序,这里为什么用泛型,大家应该都懂,为了确保类型安全。然后我们用Func<T,T,bool>引用方法。该委托的签名带有两个传入参数且返回值为Bool。

  下面就是具体的例子:

using System;
using System.Collections.Generic;
namespace ConsoleSort
{
#region 客户端
class Program
{
static void Main(string[] args)
{
//实体化雇员
Employee[] employees =
{
new Employee("张三",5000),
new Employee("李四",4000),
new Employee("王五",4500),
new Employee("赵六",5640),
new Employee("李七",1000)
};
/*将雇员实体传入排序类(ObjectSort)的排序方法(Sort)*/
/*并传入和(Func<T, T, bool>)委托匹配签名的方法(Employee.compareBysalary)*/
ObjectSort.Sort<Employee>(employees, Employee.compareBysalary);
foreach (var em in employees)
{
Console.WriteLine(em.ToString());//输出排序后的结果
}
}
}
#endregion #region 对象排序类
sealed class ObjectSort
{
/// <summary>
/// 定义Sort<T>方法,此处用的排序为冒泡排序,此方法可以对任何对象排序
/// 此处使用泛型的原因是保证类型安全
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sortArray">传入排序的对象</param>
/// <param name="comparison"></param>
public static void Sort<T>(IList<T> sortArray, Func<T, T, bool> comparison)
{ for (int i = 0; i < sortArray.Count-1; i++)
{
for (int j = sortArray.Count-1; j > i; j--)
{
if(comparison(sortArray[i],sortArray[j]))
{
T temp=sortArray[i];
sortArray[i]=sortArray[j];
sortArray[j]=temp;
}
}
}
}
}
#endregion #region 雇员实体类
sealed class Employee
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="name"></param>
/// <param name="salary"></param>
public Employee(string name, decimal salary)
{
this.Name = name;
this.Salary = salary;
}
public string Name{get;set;}
public decimal Salary{get;set;}
/// <summary>
/// 重写雇员信息的输出方式
/// </summary>
/// <returns></returns>
public override string ToString()
{
return string.Format("{0}:{1:C}", Name, Salary);
}
/// <summary>
/// Employee类中匹配Func<T,T,bool>的签名,通过雇员的工资进行比较
/// </summary>
/// <param name="em1"></param>
/// <param name="em2"></param>
/// <returns></returns>
public static bool compareBysalary(Employee em1, Employee em2)
{
return em1.Salary >em2.Salary;
}
}
#endregion
}

C#基础:通过委托给任何对象数组进行排序的更多相关文章

  1. PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($this, "cmp")))

    PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($ ...

  2. 对象数组自定义排序--System.Collections.ArrayList.Sort()

    使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...

  3. 利用Comparable接口实现对对象数组的排序

    Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口 任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该 ...

  4. 【C++基础学习】成员对象与对象数组

    第一部分 对象成员与对象数组 从一个简单的例子开始说起,首先定义一个Coordinate的类,里面有两个公有的成员变量m_iX和m_iY,分别代表横坐标和纵坐标. 接下来,定义一个对象数组cood和一 ...

  5. iOS开发之谓词Predicate和对象数组的排序

    我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词. 因为内容比较简单,所以直接上代码展示: NSMutableArray *people_arr ...

  6. js通用对象数组冒牌排序

    数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...

  7. Array 数组的排序 sort

    JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...

  8. js中对象的自定义排序

    //并返回一个可以用来对包含该成员的对象数组进行排序的比较函数 var compareAsc = function (prop) { return function (obj1, obj2) { va ...

  9. 像使用SQL一样对List对象集合进行排序

    在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组 ...

随机推荐

  1. Nginx学习——进程模型(master 进程)

    进程模型 Nginx分为Single和Master两种进程模型.Single模型即为单进程方式工作,具有较差的容错能力,不适合生产之用.Master模型即为一个master进程+N个worker进程的 ...

  2. Ubuntu Server 12.04 乱码

    sudo vim /etc/default/locale 将 下面的内容修改 LANG="zh_CN.UTF-8" LANGUAGE="zh_CN:zh" 修改 ...

  3. Spring与JDK版本不一致引发问题Caused by: java.lang.IllegalArgumentException

    tomcat启动一个spring的项目,tomcat使用8.5,JDK使用1.8,Spring使用3.0,启动之后报错 Caused by: java.lang.IllegalArgumentExce ...

  4. Python标准库:内置函数set([iterable])

    本函数是从迭代对象生成集合.集合能够添加或删除元素. 样例: #set() tset = set([1, 2, 3, 3, 4, 5, 6, 6]) print(tset) tset.add(20) ...

  5. 用Darwin开发RTSP级联服务器(拉模式转发)(附源码)

    源码下载地址:https://github.com/EasyDarwin orwww.easydarwin.org 在博客 在Darwin进行实时视频转发的两种模式 中,我们描述了流媒体服务器对源端音 ...

  6. java编程之JDBC

    JDBC的常用类和接口 1.       DriverManager类 管理数据库中的所有驱动程序,其所有的方法都是静态方法,调用时无需实例化,通过类名就可以直接调用. 2.       Connec ...

  7. 九度OJ 1097:取中值 (中值)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5092 解决:1411 题目描述: 存在两组数组,和4个数字a,b,c,d,要求做如下操作,将第一个数组第a个数到第b个数,第二个数组的第c ...

  8. call by value reference name

    按名调用 Algol 按值调用 Java https://docs.python.org/3.6/faq/programming.html#how-do-i-write-a-function-with ...

  9. 消息handler message 线程通信 空消息

    空消息的使用 private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { ...

  10. windows定时计划备份MySql

    使用 MySql 的 mysqldump 将数据库文件备份成 sql 文件. Windows下备份 本地的数据库环境 MySql 安装环境:C:\MySql 数据库名称:bbs root root 数 ...