具有IComparable实现的ArrayList.Sort()

时间:2010-08-12 03:15:55

标签: c# .net-2.0

当我编写此代码时,我在Sort()方法上出错。

       ArrayList al = new ArrayList();
        al.Add("I");
        al.Add("am");
        al.Add(27);
        al.Add("years old");


        foreach (object o in al)
        {
            Console.Write("{0} ", o.ToString());
        }

        al.Sort();
        Console.WriteLine();
        foreach (object o in al)
        {
            Console.Write("{0} ", o.ToString());
        }

好吧,我可以理解排序方法失败了,因为我在集合中包含了字符串和整数。

但是当我拥有所有字符串或所有整数时,它不会出错。它排序非常好。

  1. IComparable实现的属性是什么,可能会混淆混音?
  2. 如何识别所有整数或所有字符串以进行排序?

2 个答案:

答案 0 :(得分:2)

它使用Object的compareTo。在compareTo中,对象将检查比较对象的类型,并在此处产生错误:

字符串:IComparable

public int compareTo(Object s) {
  if (!(s is String)) {
    throws new Exception();
  }
  //do the job
}

数组的排序方法将循环遍历数组的元素,并在每个元素上调用compareTo方法以与其他元素进行比较

我还建议您使用泛型,这样您就不会在意外地将不同类型的对象放入其中。使用ArrayList<String>

答案 1 :(得分:0)

您可以使用委托创建自定义排序。下面,它是基于Address.AddressId

对地址的自定义列表进行排序
// sort list in descending order
addressList.Sort(delegate(Address a1, Address a2) { return a2.AddressId.CompareTo(a1.AddressId); });

您可以为此创建任何类型的逻辑,甚至可以将两个参数委托为对象,然后测试它们的类型,并根据它进行比较。