C#基础:通过委托给任何对象数组进行排序
在日常编写程序的时候,我们需要对一些对象进行排序,比如对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#基础:通过委托给任何对象数组进行排序的更多相关文章
- 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($ ...
- 对象数组自定义排序--System.Collections.ArrayList.Sort()
使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...
- 利用Comparable接口实现对对象数组的排序
Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口 任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该 ...
- 【C++基础学习】成员对象与对象数组
第一部分 对象成员与对象数组 从一个简单的例子开始说起,首先定义一个Coordinate的类,里面有两个公有的成员变量m_iX和m_iY,分别代表横坐标和纵坐标. 接下来,定义一个对象数组cood和一 ...
- iOS开发之谓词Predicate和对象数组的排序
我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词. 因为内容比较简单,所以直接上代码展示: NSMutableArray *people_arr ...
- js通用对象数组冒牌排序
数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...
- Array 数组的排序 sort
JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...
- js中对象的自定义排序
//并返回一个可以用来对包含该成员的对象数组进行排序的比较函数 var compareAsc = function (prop) { return function (obj1, obj2) { va ...
- 像使用SQL一样对List对象集合进行排序
在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分).你知道怎么对一个Movie对象组 ...
随机推荐
- 再过半小时,你就能明白kafka的工作原理了
本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 为什么需要消息队列 周末无聊刷着手机,某宝网APP突然蹦出来一条消息" ...
- Android组件系列----ContentProvider内容提供者【4】
(4)单元測试类: 这里须要涉及到另外一个知识:ContentResolver内容訪问者. 要想訪问ContentProvider.则必须使用ContentResolver. 能够通过ContentR ...
- OpenCV 的四大模块
前言 我们都知道 OpenCV 是一个开源的计算机视觉库,那么里面到底有哪些东西?本文将为你解答这个问题. 模块一:CV 这个模块是 OpenCV 的核心,它包含了基本的图像处理函数和高级的计算机视觉 ...
- 怎样使用在线Webapp生成器生成安装包
在这篇文章中,我们来介绍怎样使用在线(online)的Webapp生成器来生产在Ubuntu手机或模拟器中能够安装的click安装包. Webapp生成器的地址:https://developer.u ...
- db2 命令
很久没有些博客了.把以前用到的操作 DB2 的命令发表下可能有很多人已经发布了.就当是自己做下功课吧,以备有用之需. 1. 打开命令行窗口 #db2cmd 2. 打开控制中心 # db2cmd db2 ...
- spring mvc 设置设置默认首页的方式
背景: 项目使用springmvc管理请求,有一个小的需求,输入域名的时候自动进入某个页面(或者说自动发起某个请求). 过程: 1,首先想到 在web.xml中配置welcome-file-list的 ...
- ora-12170 与 Oracle lsnrctl
在startup 启动数据库后,使用plsql去连接数据库时, 出现ora-12170 错误: 在启动.关闭或者重启oracle监听器之前确保使用lsnrctl status命令检查oracle监 ...
- spring boot redis分布式锁 (转)
一. Redis 分布式锁的实现以及存在的问题 锁是针对某个资源,保证其访问的互斥性,在实际使用当中,这个资源一般是一个字符串.使用 Redis 实现锁,主要是将资源放到 Redis 当中,利用其原子 ...
- TWinControl、TCustomControl和TGraphicControl对WM_PAINT消息的三种不同处理(虚函数的特点就是升升降降)
-------------------- TWinControl收到WM_Paint消息(以后找个例子)-------------------- 1. 消息函数 TWinControl.WMPaint ...
- MapReduce源代码分析之LocatedFileStatusFetcher
LocatedFileStatusFetcher是MapReduce中一个针对给定输入路径数组,使用配置的线程数目来获取数据块位置的有用类. 它的主要作用就是利用多线程技术.每一个线程相应一个任务.每 ...