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

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

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

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Collections;
  7. namespace Demo3
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. //新建集合people用来存放person实例
  14. ArrayList people = new ArrayList();
  15. //建立4个person实例
  16. Person person1 = new Person("Jone", 18);
  17. Person person2 = new Person("Tom", 20);
  18. Person person3 = new Person("Lily", 15);
  19. Person person4 = new Person("July", 25);
  20. //将实例添加到people集合中
  21. people.Add(person1);
  22. people.Add(person2);
  23. people.Add(person3);
  24. people.Add(person4);
  25. //输出原来序列
  26. Console.WriteLine("原来序列:");
  27. foreach (Person person in people)
  28. {
  29. Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age);
  30. }
  31. //用实现Icomparable进行排序
  32. people.Sort();
  33. //用实现Icomparable的方法输出排序后的序列
  34. Console.WriteLine("按年龄排序后的序列:");
  35. foreach (Person person in people)
  36. {
  37. Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age);
  38. }
  39. //用实现Icomparer的方法进行排序
  40. people.Sort(PersonComparer.Default);
  41. //用实现Icomparer的方法输出排序后的序列
  42. Console.WriteLine("按名称排序后的序列:");
  43. foreach (Person person in people)
  44. {
  45. Console.WriteLine("person name: {0} age:{1}", person.Name, person.Age);
  46. }
  47. Console.ReadKey();
  48. }
  49. }
  50. public class Person : IComparable
  51. {
  52. /// <summary>
  53. /// 两个私有字段:
  54. /// 人物姓名;
  55. /// 人物年龄;
  56. /// </summary>
  57. private string name;
  58. private int age;
  59. /// <summary>
  60. /// 构造函数
  61. /// </summary>
  62. public Person(string myname, int myage)
  63. {
  64. name = myname;
  65. age = myage;
  66. }
  67. /// <summary>
  68. /// 两个共有属性:
  69. /// 分别对应两个私有字段;
  70. /// </summary>
  71. public string Name
  72. {
  73. set
  74. {
  75. name = value;
  76. }
  77. get
  78. {
  79. return name;
  80. }
  81. }
  82. public int Age
  83. {
  84. set
  85. {
  86. age = value;
  87. }
  88. get
  89. {
  90. return age;
  91. }
  92. }
  93. public int CompareTo(object myobject)
  94. {
  95. if (myobject is Person)//用is运算符判断要比较的对象是否是Person对象
  96. {
  97. //如果是用as运算符进行对象转换,返回年龄比较结果(一个整数,表示两者差)
  98. Person myperson = myobject as Person;
  99. return this.Age - myperson.Age;
  100. //return myperson.Age - this.Age;
  101. }
  102. else
  103. {
  104. //如果不是,抛出异常
  105. throw new ArgumentException("Object to compare to is not a Person Object");
  106. }
  107. }
  108. }
  109. public class PersonComparer : IComparer
  110. {
  111. //静态字段,方便使用,没有也可,调用方法会变
  112. public static IComparer Default = new PersonComparer();
  113. public int Compare(object myperson1, object myperson2)
  114. {
  115. //用is运算符判断要比较的对象是否都是Person对象
  116. if (myperson1 is Person && myperson2 is Person)
  117. {
  118. //如果是,调用.Net Framework已经实现好的能比较基本类型的函数:Comparer.Default.Compare
  119. //(要用using System.Collections;)
  120. return Comparer.Default.Compare(((Person)myperson1).Name, ((Person)myperson2).Name);
  121. }
  122. else
  123. {
  124. //如果不是抛出异常
  125. throw new ArgumentException("One or both objects to compare are not Person objects.");
  126. }
  127. }
  128. }
  129. }

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

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. Traversing a list

    The most common way to traverse the elements of a list is with a for loop. The syntax is the same as ...

  2. powerdesigner里的table背景色是不是可以修改的?

    Tools->Display Preferences->Format->Table->Modify->Fill->Fill color:

  3. mongodb 的 curd

        增:          db.表名.insert({name:'lisi',age:24});                                                  ...

  4. NodeJS学习笔记 (29)二进制解码-string_decoder(ok)

    原文:https://github.com/chyingp/nodejs-learning-guide 自己过一遍: 模块简介 string_decoder模块用于将Buffer转成对应的字符串.使用 ...

  5. vue中使用console.log无效

    webpack开发环境下,在vue中使用console.log无效,一直以为webpack出了问题. 使用window.console.log()就能够顺利在浏览器控制台输出了. 以及 在axios请 ...

  6. celery 学习

    1. 列出计划的ETA任务(worker) celery -A proj inspect scheduled 参考文档:http://docs.celeryproject.org/en/latest/ ...

  7. CF546E Soldier and Traveling(网络流,最大流)

    CF546E Soldier and Traveling 题目描述 In the country there are \(n\) cities and \(m\) bidirectional road ...

  8. POJ 1258 Agri-Net (最小生成树+Prim)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39820   Accepted: 16192 Descri ...

  9. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)

      主键类型 SQL语句 运行时间 (秒)   (1)模糊范围查询1000条数据,自增ID性能要好于UUID 自增ID SELECT SQL_NO_CACHE t.* FROM test.`UC_US ...

  10. CodeForces 570B Simple Game 概率

    原题: http://codeforces.com/contest/570/problem/B 题目: Simple Game time limit per test1 second memory l ...