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.");
}
}
}
}

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

最新文章

  1. npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案
  2. C# 获取磁盘空间大小的方法
  3. IOS开发中(null)与&lt;null&gt;的处理
  4. 序列化和反序列化的几种方式(DataContractSerializer)(二)
  5. NSAttributedString的用法
  6. 纠结和郁闷的存在感-关于DirectX与HLSL的矩阵存储方式---转载好文章
  7. Selenium终极自动化测试环境搭建(二)Selenium+Eclipse+Python
  8. js delete 用法
  9. 《面试题精选》15.O(logn)求Fibonacci数列
  10. python编程学习--Pygame - Python游戏编程入门(0)---转载
  11. P2689 东南西北
  12. Ubuntu 16.04安装Eclipse
  13. HashMap如何解决取Value值为Null
  14. 【资料收集】AutomationGuru
  15. 并发容器(四)ConcurrentHashMap 深入解析(JDK1.6)
  16. c++向量
  17. Eclipse------使用Debug As时报错java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX
  18. ideaIU-15.0.2 注册码
  19. BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
  20. 用PSCP在Windows和Linux之间相互传输文件

热门文章

  1. 一些标签库的学习和do的讨论
  2. 查询SqlServer最近执行过的Sql
  3. SSD-2(代码部分介绍)
  4. caffe(6) Blob,Layer,Net 以及对应配置文件的编写
  5. BZOJ 3277/3473 广义后缀自动机
  6. java uploadify 上传组件使用方法
  7. python 爬虫简介
  8. WHU 1552 Seats 枚举
  9. 找出BST里面与Target最接近的n个数
  10. MapReduce实现线性回归