代码之家  ›  专栏  ›  技术社区  ›  SaravananArumugam

具有IComparable实现的arraylist.sort()。

  •  2
  • SaravananArumugam  · 技术社区  · 14 年前

    编写此代码时,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());
            }
    

    嗯,我可以理解sort方法失败了,因为我在集合中同时包含了string和integer。

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

    1. IComparable实现的属性是什么,可能会导致混合出错?
    2. 它如何识别所有整数或所有字符串进行排序?
    2 回复  |  直到 14 年前
        1
  •  2
  •   vodkhang    14 年前

    它使用对象的比较。在CompareTo中,对象将检查所比较对象的类型,并可能在此处产生如下错误:

    字符串:IComparable

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

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

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

        2
  •  0
  •   Leon    14 年前

    可以使用委托创建自定义排序。下面,它根据address.addressID对自定义地址列表进行排序。

    // sort list in descending order
    addressList.Sort(delegate(Address a1, Address a2) { return a2.AddressId.CompareTo(a1.AddressId); });
    

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