您的位置:首页 > 编程语言 > C#

IComparable与IComparer

2015-12-30 14:05 483 查看
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    Li

Alice     Wang

Chris    Sun

Jerry    Huang
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# arraylist class