在日常编写程序的时候,我们需要对一些对象进行排序,比如对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. Quartz 2D编程指南(2)图形上下文(Graphics Contexts)

    Graphics Contexts       一个Graphics Context表示一个绘制目标(也能够理解为图形上下文).它包括绘制系统用于完毕绘制指令的绘制參数和设备相关信息.Graphics ...

  2. Java 序列化Serializable具体解释(附具体样例)

    Java 序列化Serializable具体解释(附具体样例) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描写叙述的过程:反序列化deserializa ...

  3. JNI在C和C++中的调用区别

    C-style JNI looks like (*env)->SomeJNICall(env, param1 ...) C++ style JNI looks like env->Some ...

  4. centos7 设置网络

    https://lintut.com/how-to-setup-network-after-rhelcentos-7-minimal-installation/ First, type “nmcli ...

  5. dsoframer注冊说明及在VC2010使用

    一.dsoframer在XP.win7和win8中的注冊方法. 从微软站点下载DsoFrmaer_KB311765_x86.exe,双击解开后得到的dsoframer.ocx等文件. (一)XP注冊 ...

  6. React Native组件解析(二)之Text

    React Native组件解析(二)之Text 1. 概述 Text组件对应于iOS的UILabel,Android的TextView,用来显示文本.但是Text组件的内部使用的并不是flexbox ...

  7. oracle指定访问某表或某视图

    在oracle中,想创建一个账号,然后只能只读地访问指定的表,怎么搞? 一.为特定的表创建视图 创建视图的时候还可以加上过滤条件,连访问哪些数据都可以指定. create or replace vie ...

  8. EasyDarwin接入ffmpeg实现264转图片快照功能

    本文转自:http://blog.csdn.net/cai6811376/article/details/51774467 EasyDarwin一直坚持开源精神,所以我们着手把EasyDarwin中使 ...

  9. vs添加对dll的引用

    我们在使用vs进行开发调试的时候经常会遇到一个问题,就是当我们的主工程引用到其他工程更新的dll(我们经常采用copy到工程目录的方法).亦或者当我们的多个工程引用到同一个dll文件的时候,我们怎么来 ...

  10. arm处理器的历史及现状

    1 arm处理器的发展历史 arm1 arm2 arm3 arm6 arm7 arm9 arm11 arm cortex 2 arm处理器现状 arm cortex A a即application,即 ...