当我们将一些数据存储在一个集合中时,往往会有排序的需求,比如游戏中的积分排行榜,学生考试系统中的分数排行,或者根据不同的条件(根据姓名、根据年龄)进行排序。当出现这些需求的时候,我们希望建立一种规则,根据这种规则就可以确定两个数据的前后关系。其实,这种规则我们就可以用接口来定义。
一、使用集合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方法中,我们根据学生的年龄进行比较,让年龄小的学生排在前面(返回负数)。然后我们再运行一遍代码,最终得到的运行结果