Добавить в цитаты Настройки чтения

Страница 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(&quot;Исходный порядок следования: &quot;);</b>

<b>    foreach(int i in nums)</b>

<b>      Console.Write(i + &quot; &quot;) ;</b>

<b>    Console.WriteLine();</b>

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

<b>    Array.Sort(nums);</b>

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

<b>    Console.Write(&quot;Порядок следования после сортировки: &quot;);</b>

<b>    foreach(int i in nums)</b>

<b>      Console.Write(i + &quot; &quot;);</b>

<b>    Console.WriteLine();</b>

<b>    // Найти значение 14.</b>

<b>    int idx = Array.BinarySearch(nums, 14);</b>

<b>    Console.WriteLine(&quot;Индекс элемента массива со значением 14: &quot; + 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&lt;T&gt;. Если же ни один из этих интерфейсов не реализован в данном классе, то во время выполнения программы может возникнуть исключительная ситуация в связи с попыткой отсортировать подобный массив или осуществить в нем поиск. Правда, реализовать оба интерфейса, IComparable и IComparable&lt;T&gt;, совсем нетрудно.

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

<b>int CompareTo(object obj)</b>

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

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

<b>int CompareTo(Т other)</b>

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

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

<b>using System;</b>

<b>class MyClass : IComparable&lt;MyClass&gt; {</b>

<b>  public int i;</b>

<b>  public MyClass(int x) {</b>

<b>    i = x;</b>

<b>  }</b>

<b>  // Реализовать интерфейс IComparable&lt;MyClass&gt;.</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>