Страница 362 из 502
<b>// Отсортировать массив и найти в нем значение.</b>
<b>using System;</b>
<b>class SortDemo {</b>
<b> static void Main() {</b>
<b> int[] nums = { 5, 4, 6, 3, 14, 9, 8, 17, 1, 24, -1, 0 };</b>
<b> // Отобразить исходный порядок следования.</b>
<b> Console.Write("Исходный порядок следования: ");</b>
<b> foreach(int i in nums)</b>
<b> Console.Write(i + " ") ;</b>
<b> Console.WriteLine();</b>
<b> // Отсортировать массив.</b>
<b> Array.Sort(nums);</b>
<b> // Отобразить порядок следования после сортировки.</b>
<b> Console.Write("Порядок следования после сортировки: ");</b>
<b> foreach(int i in nums)</b>
<b> Console.Write(i + " ");</b>
<b> Console.WriteLine();</b>
<b> // Найти значение 14.</b>
<b> int idx = Array.BinarySearch(nums, 14);</b>
<b> Console.WriteLine("Индекс элемента массива со значением 14: " + idx) ;</b>
<b> }</b>
<b>}</b>
Вот к какому результату приводит выполнение этой программы.
<b>Исходный порядок следования: 5 4 6 3 14 9 8 17 1 24 -1 0</b>
<b>Порядок следования после сортировки: -1 0 1 3 4 5 6 8 9 14 17 24</b>
<b>Индекс элемента массива со значением 14: 9</b>
В приведенном выше примере массив состоит из элементов типа int, который относится к категории типов значений. Все методы, определенные в классе Array, автоматически доступны для обработки массивов всех встроенных в C# типов значений. Но в отношении массивов ссылок на объекты это правило может и не соблюдаться. Так, для сортировки массива ссылок на объекты в классе типа этих объектов должен быть реализован интерфейс IComparable или IComparable<T>. Если же ни один из этих интерфейсов не реализован в данном классе, то во время выполнения программы может возникнуть исключительная ситуация в связи с попыткой отсортировать подобный массив или осуществить в нем поиск. Правда, реализовать оба интерфейса, IComparable и IComparable<T>, совсем нетрудно.
В интерфейсе IComparable определяется один метод.
<b>int CompareTo(object obj)</b>
В этом методе значение вызывающего объекта сравнивается со значением объекта, определяемого параметром obj. Если значение вызывающего объекта больше, чем у объекта obj, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта obj, — отрицательное значение.
Интерфейс IComparable<T> является обобщенным вариантом интерфейса IComparable. Поэтому в нем определен следующий обобщенный вариант метода CompareTo().
<b>int CompareTo(Т other)</b>
Обобщенный вариант метода CompareTo() действует аналогично необобщенному его варианту. В нем значение вызывающего объекта также сравнивается со значением объекта, определяемого параметром other. Если значение вызывающего объекта больше, чем у объекта other, то возвращается положительное значение; если оба значения равны — нулевое значение, а если значение вызывающего объекта меньше, чем у объекта other, — отрицательное значение. Преимущество интерфейса IComparable<T> заключается в том, что он обеспечивает типовую безопасность, поскольку в этом случае тип обрабатываемых данных указывается явным образом, а следовательно, никакого приведения типа object сравниваемого объекта к нужному типу не требуется. В качестве примера ниже приведена программа, в которой демонстрируются сортировка и поиск в массиве объектов определяемого пользователем класса.
<b>// Отсортировать массив объектов и осуществить в нем поиск,</b>
<b>using System;</b>
<b>class MyClass : IComparable<MyClass> {</b>
<b> public int i;</b>
<b> public MyClass(int x) {</b>
<b> i = x;</b>
<b> }</b>
<b> // Реализовать интерфейс IComparable<MyClass>.</b>
<b> public int CompareTo(MyClass v) {</b>
<b> return i - v.i;</b>
<b> }</b>
<b> public bool Equals(MyClass v) {</b>
<b> return i == v.i;</b>
<b> }</b>
<b>}</b>
<b>class SortDemo {</b>
<b> static void Main() {</b>
<b> MyClass[] nums = new MyClass[5];</b>
<b> nums[0] = new MyClass(5);</b>
<b> nums[1] = new MyClass(2);</b>