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对象组 ...
随机推荐
- Nginx详细的安装教程(linux)
转:https://blog.csdn.net/u013641234/article/details/73838472 Nginx作为一个web服务器,目前使用最多的就利用其负载均衡,本篇着重讲解的是 ...
- 如何清除本地DNS缓存 windows
在您的网站迁移服务器时需要对域名所指向的IP进行更改,这时候在本机访问网站时就需要清除本地的DNS缓存信息,那么怎样清除呢? 首先我们应该明白清除DNS缓存信息的原理:当计算机对域名访问时并不是每次访 ...
- Ajax技术实现页面无刷新跳转
Ajax实现无刷新显示新的页面 <!DOCTYPE html> <html> <head> <script src="/jquery/jquery- ...
- 模式识别之不变矩---SIFT和SURF的比较
- 用 ERD 盘解决 Win8 自己主动更新后不能启动的问题
用 ERD 盘解决 Win8 自己主动更新后不能启动的问题 有安装了 Win8 x64 系统的台式机,在自己主动更新后无法启动了.在黑屏的情况下.没有反应了. 安全模式也无法进入系统. 几经周折,发现 ...
- postgresql的show databases、show tables、describe table操作
1.相当与mysql的show databases; select datname from pg_database; 2.相当于mysql的show tables; SELECT table_nam ...
- 用live555做流媒体转发服务器?
当我们看到这里,说明大家都有这样的一个想法:那就是如何用live555实现一个直播代理转发的流媒体服务器? 我们先不着急去讨论用live555实现流媒体转发的技术方法123,先从live555的整个架 ...
- MongoDB复制集架构搭建
创建目录 mkdir -p /data/r0 /data/r1 /data/r2 声明实例 ./bin/mongod --port 27017 --dbpath /home/workspace/dat ...
- rac_udev建立磁盘方式安装grid时不识别磁盘
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- SAP bseg 使用注意点:1.不要使用;2.有主键再用,
粗表-簇表 cluster-table BSEGRFBLG 池表 pool-table 我記的沒錯的話,在21天學會ABAP中有一節是專門在講Cluster table,另外在 www.sapfans ...