1.当我们要对集合进行排序时,集合中的元素必须要是一类元素,且元素的类型实现了IComparable接口
ArrayList arr = new ArrayList() { 0, 8, 32, 4, 2, 432, 5, 234, 54323, 875, 45 };
arr.Sort();
for (int i = 0; i < arr.Count; i++)
{
Console.Write("{0} ",arr[i]);
}
Console.ReadKey();
结果是:
...............................................................
0 2 4 5 8 32 45 234 432 875 54323
这是因为int类型继承了IComparable接口,因此可以排序
2.那么我们是否可以为自定义的类型进行排序呢,答案是一定的
我们想为Person这个类按照某种条件进行排序,那么首先它必须实现Icomparable接口,以及实现这个接口中的方法CompareTo
class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person p = obj as Person;
if (p == null)
{
throw new ArgumentException();
}
else
{
return this.Age-p.Age;
//return this.Name.Length - p.Name.Length;
}
}
}
按照年龄进行升序排序ArrayList arr = new ArrayList() {
new Person(){ Name="Alice Wang", Age=19},
new Person(){ Name="Wayen Li", Age=12},
new Person(){ Name="Chris Sun", Age=21},
new Person(){ Name="Jerry Huang", Age=22}
};
Console.WriteLine("排序之前:");
for (int i = 0; i < arr.Count; i++)
{
Console.WriteLine(((Person)arr[i]).Name);
}
//IComparable
//升序排序
arr.Sort();
Console.WriteLine("排序之后:");
for (int i = 0; i < arr.Count; i++)
{
Console.WriteLine(((Person)arr[i]).Name);
}
Console.ReadKey();
结果是:
.........................................................................
Wayen Li
Alice Wang
Chris Sun
Jerry Huang
如果按照名字的长度进行排序的话,结果是
.........................................................................
Wayen Li
Chris Sun
Alice Wang
Jerry Huang
3.我们也可以定义一个类,继承自IComparer接口,用作比较器
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class PersonSortByAgeAsc : IComparer
{
#region IComparer 成员
public int Compare(object x, object y)
{
Person p1 = x as Person;
Person p2 = y as Person;
if (p1 != null && p2 != null)
{
return p1.Age - p2.Age;
}
else
{
throw new ArgumentException();
}
}
#endregion
}
按年龄大小进行升序排列
ArrayList arr = new ArrayList() {
new Person(){ Name="Alice Wang", Age=19},
new Person(){ Name="Wayen Li", Age=12},
new Person(){ Name="Chris Sun", Age=21},
new Person(){ Name="Jerry Huang", Age=22}
};
//按照年龄升序排序
arr.Sort(new PersonSortByAgeAsc());
for (int i = 0; i < arr.Count; i++)
{
Console.WriteLine(((Person)arr[i]).Name);
}
Console.ReadKey();
结果是:
.........................................................................
Wayen LiAlice Wang
Chris Sun
Jerry Huang