Icomparer和Icomparable集合排序
2024-08-31 16:27:22
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.");
}
}
}
}
方法论:读书加上网查询相关资料,能够更好的理解知识点。
最新文章
- npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案
- C# 获取磁盘空间大小的方法
- IOS开发中(null)与<;null>;的处理
- 序列化和反序列化的几种方式(DataContractSerializer)(二)
- NSAttributedString的用法
- 纠结和郁闷的存在感-关于DirectX与HLSL的矩阵存储方式---转载好文章
- Selenium终极自动化测试环境搭建(二)Selenium+Eclipse+Python
- js delete 用法
- 《面试题精选》15.O(logn)求Fibonacci数列
- python编程学习--Pygame - Python游戏编程入门(0)---转载
- P2689 东南西北
- Ubuntu 16.04安装Eclipse
- HashMap如何解决取Value值为Null
- 【资料收集】AutomationGuru
- 并发容器(四)ConcurrentHashMap 深入解析(JDK1.6)
- c++向量
- Eclipse------使用Debug As时报错java.lang.IllegalStateException: Failed to read Class-Path attribute from manifest of jar file:/XXX
- ideaIU-15.0.2 注册码
- BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
- 用PSCP在Windows和Linux之间相互传输文件