ArrayList.Sort () с реализацией IComparable - PullRequest
2 голосов
/ 12 августа 2010

Когда я пишу этот код, я получаю сообщение об ошибке в методе 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 ]

2 голосов
/ 12 августа 2010

Используется сравнение объекта. Внутри compareTo объект проверит тип сравниваемого объекта и может вызвать там ошибку, подобную этой:

Строка: IComparable

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

Метод сортировки массива будет проходить по элементам массива и вызывать метод CompareTo для каждого элемента для сравнения с другими элементами

Я также рекомендую вам использовать дженерики, чтобы вы никогда не могли случайно помещать различные типы объектов внутрь. Используйте ArrayList<String>

0 голосов
/ 28 августа 2010

Вы можете использовать делегата для создания пользовательской сортировки. Ниже сортируется пользовательский список адресов на основе Address.AddressId

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

Вы можете создать для этого любую логику, даже получая оба параметра для делегирования в виде объектов, а затем проверяя их тип и сравнивая их на основе этого.

...