现在的位置: 首页 > 综合 > 正文

IComparable接口和IComparer接口(一)

2013年03月12日 ⁄ 综合 ⁄ 共 2182字 ⁄ 字号 评论关闭

Array类实现了对数组中元素的冒泡排序。Sort()方法需要数组实现IComparable接口。简单类型,如System.String和System.Int32实现了IComparable接口,所以可以对包含这些类型的元素排序。

      在下面例子中,数组name包含string类型的元素,这个数组是可以排序的。

String[] names = {
    "Christina Aguillera",
    "Shakira",
    "Beyonce",
    "Gwen Stefani"
};
Array.Sort(names);

foreach(string name in names)
{
    Console.WriteLine(name);
}

该应用程序的输出是排序好得数组:

Beyonce

Christina Aguillera

Gwen Stefani

Shakira

如果对数组使用定制的类,就必须实现IComparable接口。这个接口之定义了一个方法CompareTo(),如果要比较的对象相等,该方法就返回0。如果实力应排在参数对象的前面,该方法就返回小于0的值。如果实例应排在参数对象的后面,该方法就返回大于0的值。

定义一个Person类,使之执行IComparable接口。对LastName的值进行比较。LastName是string类型,而String类已经实现了IComparable接口,所以可以使用String类中CompareTo()方法的实现代码。如果LastName的值相同,就比较FirstName:

public class Person:IComparable
{
     public int CompareTo(object obj)
     {
         Person other = obj as Person;
         int result = this.LastName.CompareTo(other.LastName);
         if(result ==0) //如果LastName的值相同,就比较FirstName
         {
             result = this.FirstName.CompareTo(other.FirstName);
         }
      return result;
     }
}

 

     如果Person对象的排序方式与上述不同,或者不能修改在数组中用作元素的类,就可以执行IComparer接口。这个接口定义了方法Compare()。IComparable接口必须由要比较的类来执行,而IComparer接口独立于要比较的类。这就是Compare()方法定义了两个要比较的变元的原因。其返回值与IComparable接口的CompareTo()方法类似。

      类Personcomparer实现了IComparer接口,可以按照firstName或LastName对Person对象排序。枚举PersonCompareType定义了与PersonComparer相当的排序选项:FirstName和LastName。排序的方式有类PersonComparer的构造函数定义,在该构造函数中设置了一个PersonCompareType值。Compare()方法用一个switch语句指定是按照firstName还是lastName排序。

    public class PersonComparer : IComparer
    {
        public enum PersonCompareType
        {
            FirstName,
            LastName
        }

        private PersonCompareType compareType;

        public PersonComparer(PersonCompareType compareType)
        {
            this.compareType = compareType;
        }

        #region IComparer Members

        public int Compare(object x, object y)
        {
            Person p1 = x as Person;
            Person p2 = y as Person;
            switch (compareType)
            {
                case PersonCompareType.FirstName:
                    return p1.FirstName.CompareTo(p2.FirstName);
                case PersonCompareType.LastName:
                    return p1.LastName.CompareTo(p2.LastName);
                default:
                    throw new ArgumentException("unexpected compare type");
            }
            
        }

        #endregion
    }

现在,可以将一个PersonComparer对象传送给Array.Sort()方法的第二个变元(public static void Sort(Array array, IComparer comparer);)。下面是按名字对Persons数据排序:

            Array.Sort(persons, new PersonComparer(PersonComparer.PersonCompareType.FirstName));
            foreach (Person p in persons)
            {
                Console.WriteLine(p);
            }

Persons数组现在按名字排序:

Ayrton senna

Emerson Fittipaldi

Michael Schumacher

Niki Lauda

IComparable<T>:

 

抱歉!评论已关闭.