В приведенном выше примере массив состоит из элементов типа int, который относится к категории типов значений. Все методы, определенные в классе Array, автоматически доступны для обработки массивов всех встроенных в C# типов значений. Но в отношении массивов ссылок на объекты это правило может и не соблюдаться. Так, для сортировки массива ссылок на объекты в классе типа этих объектов должен быть реализован интерфейс IComparable или IComparable. Если же ни один из этих интерфейсов не реализован в данном классе, то во время выполнения программы может возникнуть исключительная ситуация в связи с попыткой отсортировать подобный массив или осуществить в нем поиск. Правда, реализовать оба интерфейса, IComparable и IComparable, совсем нетрудно.

В интерфейсе IComparable определяется один метод.

int CompareTo(object obj)

В этом методе значение вызывающего объекта сравнивается со значением объекта, определяемого параметром obj. Если значение вызывающего объекта больше, чем у объекта obj, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта obj, — отрицательное значение.

Интерфейс IComparable является обобщенным вариантом интерфейса IComparable. Поэтому в нем определен следующий обобщенный вариант метода CompareTo().

int CompareTo(Т other)

Обобщенный вариант метода CompareTo() действует аналогично необобщенному его варианту. В нем значение вызывающего объекта также сравнивается со значением объекта, определяемого параметром other. Если значение вызывающего объекта больше, чем у объекта other, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта other, — отрицательное значение. Преимущество интерфейса IComparable заключается в том, что он обеспечивает типовую безопасность, поскольку в этом случае тип обрабатываемых данных указывается явным образом, а следовательно, никакого приведения типа object сравниваемого объекта к нужному типу не требуется. В качестве примера ниже приведена программа, в которой демонстрируются сортировка и поиск в массиве объектов определяемого пользователем класса.

// Отсортировать массив объектов и осуществить в нем поиск,

using System;

class MyClass : IComparable {

  public int i;

  public MyClass(int x) {

    i = x;

  }

  // Реализовать интерфейс IComparable.

  public int CompareTo(MyClass v) {

    return i - v.i;

  }

  public bool Equals(MyClass v) {

    return i == v.i;

  }

}

class SortDemo {

  static void Main() {

    MyClass[] nums = new MyClass[5];

    nums[0] = new MyClass(5);

    nums[1] = new MyClass(2);

    nums[2] = new MyClass(3);

    nums[3] = new MyClass(4);

    nums[4] = new MyClass(1);

    // Отобразить исходный порядок следования.

    Console.Write("Исходный порядок следования: ");

    foreach (MyClass о in nums)

      Console.Write(о.i + " ");

    Console.WriteLine();

    // Отсортировать массив.

    Array.Sort(nums);

    // Отобразить порядок следования после сортировки.

    Console.Write("Порядок следования после сортировки: ");

    foreach (MyClass о in nums)

      Console.Write(о.i + " ");

    Console.WriteLine();

    // Найти объект MyClass(2).

    MyClass x = new MyClass(2);

    int idx = Array.BinarySearch(nums, x);

    Console.WriteLine("Индекс элемента массива с объектом MyClass(2): " + idx);

  }

}

При выполнении этой программы получается следующий результат.

Исходный порядок следования: 5 2 3 4 1

Порядок следования после сортировки: 1 2 3 4 5

Индекс элемента массива с объектом MyClass(2): 1

Перейти на страницу:

Похожие книги