c#中实现对象集合的排序可以使用ArrayList中的Sort()方法,而有比较才能谈排序,因为不是基本类型(如string ,int.double......等)所以.NET Framework不可能一一制定他们的比较规则,那么则需要程序员自行制定,而比较规则的制定就需要通过继承这两个接口>之一来实现。制定了比较规则后则才可以用以下两种方式之一调用排序:

(1)ArrayList实例.Sort(); // IComparable

(2)ArrayList实例.Sort(实现Icomparer接口的类); // Icomparer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections; namespace Demo3
{
class Program
{
static void Main(string[] args)
{
//新建集合people用来存放person实例
ArrayList people = new ArrayList();
//建立4个person实例
Person person1 = new Person("Jone", 18);
Person person2 = new Person("Tom", 20);
Person person3 = new Person("Lily", 15);
Person person4 = new Person("July", 25);
//将实例添加到people集合中
people.Add(person1);
people.Add(person2);
people.Add(person3);
people.Add(person4);
//输出原来序列
Console.WriteLine("原来序列:");
foreach (Person person in people)
{
Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age);
}
//用实现Icomparable进行排序
people.Sort();
//用实现Icomparable的方法输出排序后的序列
Console.WriteLine("按年龄排序后的序列:");
foreach (Person person in people)
{
Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age);
}
//用实现Icomparer的方法进行排序
people.Sort(PersonComparer.Default);
//用实现Icomparer的方法输出排序后的序列
Console.WriteLine("按名称排序后的序列:");
foreach (Person person in people)
{
Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age);
}
Console.ReadKey();
}
} public class Person : IComparable
{
/// <summary>
/// 两个私有字段:
/// 人物姓名;
/// 人物年龄;
/// </summary>
private string name;
private int age; /// <summary>
/// 构造函数
/// </summary>
public Person(string myname, int myage)
{
name = myname;
age = myage;
} /// <summary>
/// 两个共有属性:
/// 分别对应两个私有字段;
/// </summary>
public string Name
{
set
{
name = value;
}
get
{
return name;
}
}
public int Age
{
set
{
age = value;
}
get
{
return age;
}
} public int CompareTo(object myobject)
{
if (myobject is Person)//用is运算符判断要比较的对象是否是Person对象
{
//如果是用as运算符进行对象转换,返回年龄比较结果(一个整数,表示两者差)
Person myperson = myobject as Person;
return this.Age - myperson.Age;
//return myperson.Age - this.Age;
}
else
{
//如果不是,抛出异常
throw new ArgumentException("Object to compare to is not a Person Object");
}
}
} public class PersonComparer : IComparer
{
//静态字段,方便使用,没有也可,调用方法会变
public static IComparer Default = new PersonComparer();
public int Compare(object myperson1, object myperson2)
{
//用is运算符判断要比较的对象是否都是Person对象
if (myperson1 is Person && myperson2 is Person)
{
//如果是,调用.Net Framework已经实现好的能比较基本类型的函数:Comparer.Default.Compare
//(要用using System.Collections;)
return Comparer.Default.Compare(((Person)myperson1).Name, ((Person)myperson2).Name);
}
else
{
//如果不是抛出异常
throw new ArgumentException("One or both objects to compare are not Person objects.");
}
}
}
}

方法论:读书加上网查询相关资料,能够更好的理解知识点。

Icomparer和Icomparable集合排序的更多相关文章

  1. C# List.Sort与IComparer接口及Comparison委托应用于集合排序

    C#里List.Sort的用法 using System; using System.Collections.Generic; using System.Linq; using System.Text ...

  2. .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解

    本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...

  3. .Net中集合排序的一种高级玩法

    背景: 学生有名称.学号, 班级有班级名称.班级序号 学校有学校名称.学校编号(序号) 需求 现在需要对学生进行排序 第一排序逻辑 按学校编号(序号)排列 再按班级序号排列 再按学生学号排列 当然,在 ...

  4. 通过写一个Demo展示C#中多种常用的集合排序方法

    不多说,程序很简单,就是将集合中的数据进行排序,但使用到的知识点还是比较多的,大牛勿喷,谨献给初学者!直接上程序吧! namespace Demo { /// <summary> /// ...

  5. Java比较器对数组,集合排序一

    数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...

  6. ArrayList集合排序

    using System;using System.Collections;using System.Collections.Generic;using System.Text; namespace ...

  7. 【Java进阶】---map集合排序

    map集合排序         这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题.   比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...

  8. CopyOnWriteArrayList集合排序异常问题

    1.集合自定义排序实现 对List集合的自定义排序想必大家都知道要使用如下的方式,通过实现Comparator接口并实现compare方法来实现. /** * * @方法名 changeChain * ...

  9. 二维码扫描&集合排序

    一.二维码扫描机制 二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构 ...

随机推荐

  1. SPFA的两种优化

    SPFA是可以优化的,这个大家都是晓得的吧. 下面介绍两种SPFA的神奇优化(我只代码实现了的一种) SLF:Small Label First策略,设要加入的节点是j,队首元素为i,若dist(j) ...

  2. windows如何批量添加路由表

    我大约有2000条路由,需要批量导入,如何才能快速导入,快速删除呢.如果直接用命令添加路由表的话感觉很慢. windows如何批量添加路由表 >> csharp这个答案描述的挺清楚的:ht ...

  3. struts2中标签库访问静态成员

    struts2中是可以访问静态成员的,需要以下设置: 1.设置配置文件 struts.xml 中如下: <!-- 设置运行通过ONGL访问静态方法 --> <constant nam ...

  4. 关于 nginx 的配置的 location

    精准匹配和普通匹配:    server{            location =/index.htm{                                       ////精准匹 ...

  5. notepad++调用python3中文乱码

    使用notepad++,配置好快捷键调用python3,一切就绪,仿佛就差代码了,结果一使用, 中文乱码,一直没有好的解决办法. 最后只能在代码中增加一行重写向输出解决,示例如下: #!/usr/bi ...

  6. 题解 P2872 【[USACO07DEC]道路建设Building Roads】

    这道题真的是令人窒息,Kruskal调了贼久一直RE,最后发现数组大小稍微少了那么一点点.(也就10倍吧..) 言归正传,根据本人的分析(以及算法标签的提示),这是一道求最小生成树的题目,当然要注意已 ...

  7. /*+parallel(t,4)*/在SQL调优中的重要作用!

    谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用! /*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源. ...

  8. 一个工作快八年的老IT人士这几年沉浮总结的职场经验教训

    曾经我挺喜欢写博客,认为把心中的想法表达出来非常畅快.而且还能和网上非常多人沟通交流,如今我更喜欢把想法留在心中.博客非常久没更新了,刚才闲来无事.看看职场话题版块发现非常多人都挺迷茫的,所以我写一些 ...

  9. AFNetworking框架的使用

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...

  10. atitit.js&#160;与c#&#160;java交互html5化的原理与总结.doc

    atitit.js 与c# java交互html5化的原理与总结.doc 1. 实现html5化界面的要解决的策略 1 1.1. Js交互 1 1.2. 动态參数个数 1 1.3. 事件监听 2 2. ...