在日常编写程序的时候,我们需要对一些对象进行排序,比如对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. 根据百度地图API获取指定地点的经纬度

    做项目时,遇到对地点获取地图中对应的经纬度,作一下笔记,以备以后直接使用 package com.hpzx.data; import java.io.BufferedReader; import ja ...

  2. JavaScript中批量设置Css样式

    设置 input 元素的  属性: document.getElementsByTagName("INPUT")[0].setAttribute("属性",&q ...

  3. 2015最新iherb海淘攻略-图文入门教程-6月免邮

    注:仅仅有首次下单才享有新人优惠10$,大家下单之后千万不要取消后.否则之后则不享有新人优惠. 注:眼下Sino-海淘客国际物流已取消,仅有UCS合众速递. IHerb是美国最热门的海淘海购网站之中的 ...

  4. CCBPM中的消息机制,CCIM服务端安装说明

    1.改动LeeIMService.exe.config服务端配置文件: 2.client的配置就比較简单了,仅仅须要在"SercerIP"节点上写上server的IP: 3.然后要 ...

  5. EasyDarwin开源流媒体服务器提供的RTMP直播推送库

    EasyRTMP EasyRTMP是什么? EasyRTMP是一个EasyDarwin配套使用,也可以单独使用的RTMP推送库,通过EasyRTMP我们就可以避免接触到稍显复杂的RTMP推送流程,只需 ...

  6. MongoDB——mongo-connector同步到ES

    1.搭建完毕MongoDb复制集环境 2.开始安装 mongo-connector pip install mongo-connector:基于pip命令,不管是linux .window 系统默认有 ...

  7. final、finally、三个关键字的区别

    一 final 如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以 ...

  8. ALTER USER USER() IDENTIFIED BY 'password';

    [root@test mysql]# bin/mysqld 2018-08-04T14:09:33.831318Z 0 [Warning] [MY-011070] [Server] 'Disablin ...

  9. SPDY: An experimental protocol for a faster web HTTP/2

    http://www.chromium.org/spdy/spdy-whitepaper https://en.wikipedia.org/wiki/SPDY Internet protocol su ...

  10. APP上线审核注意事项

    基本要点 ·         不能导致手机故障(比如崩溃或屏幕问题) ·         长时间/过度使用之后反应仍然很快 ·         应用内的所有价格信息中不能用固定值代替可变变量 ·    ...