C#中的比较和排序

当我们将一些数据存储在一个集合中时,往往会有排序的需求,比如游戏中的积分排行榜,学生考试系统中的分数排行,或者根据不同的条件(根据姓名、根据年龄)进行排序。当出现这些需求的时候,我们希望建立一种规则,根据这种规则就可以确定两个数据的前后关系。其实,这种规则我们就可以用接口来定义。

一、使用集合ArrayList排序

在列表中添加一些数据,打印列表的元素,得到如图

public class s1: MonoBehaviour {
	
	void Start () {
		List<int> list = new List<int>();
		list.Add(3);
		list.Add(13);
		list.Add(2);
		list.Add(8);
		list.Add(21);

		//排序前
		printList(list);
		//排序
		list.Sort();
		//排序后
		printList(list);
	}

	void Update () {

	}

	void printList(List<int> list) {
		for (int i = 0;i< list.Count;i++) {
			print(list[i]);
		}
	}
}

在调用了Sort方法之后,打印出来的顺序是将数据进行了从小到大的排序

二、字符串类型排序

public class stringSort : Monobehaviour {
	
	void Start () {
		List<string> list = new List<string>();
		list.Add("Jobs"); //向列表中添加字符串数据
		list.Add("Linus");
		list.Add("Jensen");
		list.Add("Alex");
		list.Add("Bob");
	}

	//排序前
	printList(list);
	//排序
	list.Sort();
	//排序后
	printList(list);

	void printList(List<string> list)
	{
		for (int i = 0;i < list.Count; i++)
		{
			print(list[i]);
		}
	}
}

三、自定义类型排序

public class student : IComparable
{
	private string name;
	private int age;

	public Student(string name, int age)
	{
		this.name = name;
		this.age = age;
	}

	public string Name
	{
		get
		{
			return this.name;
		}
	}

	public int Age
	{
		get
		{
			return this.age;
		}
	}

	public int CompareTo(object other)
	{
		if (other is Student)
		{
			Student s = other as Student;
			if (this.age < s.age)
				return -1;
			else if (this.age == s.age)
				return 0;
			else 
				return 1;
		}
		else
		{
			throw new Exeption("not student exception");
		}
	}

	public override string ToString()
	{
		return string.Format("Student[Name:{0}, Age:{1}]", this.name, this.age);
	}
}

从Console窗口中,程序在调用Sort()方法的时候出现了问题,这个错误为ArgumentException,具体的错误内容是:does not implement right interace,也就说没有实现正确的接口。根据MSDN中的介绍,需要排序的类型,必须实现IComparable接口,这个接口在C#中的定义如下:

public interface IComparable
{
	int CompareTo(object obj);
}

当实现接口中的CompareTo方法时,如果返回小于0时,表示当前对象是排在另一个对象前面的;如果返回值等于0,表示当前对象和另一个对象在相同的位置;如果大于0则表示当前对象在另一对象后面。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Student
{
	private string name;
	private int age;
}

public Student(string name, int age)
{
	this.name = name;
	this.age = age;
}

public string Name
{
	get
	{
		return this.name;
	}
}

public int Age
{
	get
	{
		return this.age;
	}
}

public override string ToString()
{
	return string.Format("Student[Name:{0},Age:{1}",this.name,this.age);
}

public class ClassSort : Monobehaviour {
	
	void Start () {
		Student s1 = new Student("Jobs", 10);
		Student s2 = new Student("Linus", 9);
		Student s3 = new Student("Jensen", 11);
		Student s4 = new Student("Alex", 13);
		Student s5 = new Student("Bob" , 8);

		list.Add(s1); 
		list.Add(s2);
		list.Add(s3);
		list.Add(s4);
		list.Add(s5);
	}

	//排序前
	printList(list);
	//排序
	list.Sort();
	//排序后
	printList(list);

	void printList(List<Student> list)
	{
		for (int i = 0;i < list.Count; i++)
		{
			print(list[i]);
		}
	}
}

在上述代码中让Student实现了IComparable接口,在CompareTo方法中,我们根据学生的年龄进行比较,让年龄小的学生排在前面(返回负数)。然后我们再运行一遍代码,最终得到的运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客范儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值