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

Страница 145 из 502

Как вам должно быть уже известно, индексирование всех массивов в C# начинается с нуля. Но в некоторых приложениях индексирование массива удобнее начинать с любой произвольной точки отсчета: с 1 или даже с отрицательного числа, например от -5 и до 5. Рассматриваемый здесь класс RangeArray разработан таким образом, чтобы допускать подобного рода индексирование массивов.

Используя класс RangeArray, можно написать следующий фрагмент кода.

<b>RangeArray ra = new RangeArray(-5, 10); // массив с индексами от -5 до 10 </b>

<b>for(int i=-5; i &lt;= 10; i++) ra[i] = i; // индексирование массива от -5 до 10</b>

Нетрудно догадаться, что в первой строке этого кода конструируется объект класса RangeArray с пределами индексирования массива от -5 до 10 включительно. Первый аргумент обозначает начальный индекс, а второй — конечный индекс. Как только объект ra будет сконструирован, он может быть проиндексирован как массив в пределах от -5 до 10.

Ниже приведен полностью класс RangeArray вместе с классом RangeArrayDemo, в котором демонстрируется индексирование массива в заданных пределах. Класс RangeArray реализован таким образом, чтобы поддерживать массивы типа int, но при желании вы можете изменить этот тип на любой другой.

<b>/* Создать класс со специально указываемыми пределами индексирования массива. Класс RangeArray допускает индексирование массива с любого значения, а не только с нуля. При создании объекта класса RangeArray указываются начальный и конечный индексы. Допускается также указывать отрицательные индексы. Например, можно создать массивы, индексируемые от -5 до 5, от 1 до 10 или же от 50 до 56. */</b>

<b>using System;</b>

<b>class RangeArray {</b>

<b>  // Закрытые данные.</b>

<b>  int[] a; // ссылка на базовый массив </b>

<b>  int lowerBound; // наименьший индекс int </b>

<b>  int upperBound; // наибольший индекс</b>

<b>  // Автоматически реализуемое и доступное </b>

<b>  //только для чтения свойство Length, </b>

<b>  public int Length { get; private set; }</b>

<b>  // Автоматически реализуемое и доступное </b>

<b>  //только для чтения свойство Error, </b>

<b>  public bool Error { get; private set; }</b>

<b>  // Построить массив по заданному размеру, </b>

<b>  public RangeArray(int low, int high) {</b>

<b>    high++;</b>

<b>    if (high &lt;= low) {</b>

<b>      Console.WriteLine(&quot;Неверные индексы&quot;);</b>

<b>      high = 1; // создать для надежности минимально допустимый массив </b>

<b>      low = 0;</b>

<b>    }</b>

<b>    a = new int[high - low];</b>

<b>    Length = high - low;</b>

<b>    lowerBound = low;</b>

<b>    upperBound = --high;</b>

<b>  }</b>

<b>  // Это индексатор для класса RangeArray. </b>

<b>  public int this[int index] {</b>

<b>    // Это аксессор get. </b>

<b>    get {</b>

<b>      if (ok(index)) {</b>

<b>        Error = false;</b>

<b>        return a[index - lowerBound];</b>

<b>      }</b>

<b>      else {</b>

<b>        Error = true;</b>

<b>        return 0;</b>

<b>      }</b>

<b>    }</b>

<b>    // Это аксессор set. </b>

<b>    set {</b>

<b>      if (ok(index)) {</b>

<b>        a[index - lowerBound] = value;</b>

<b>        Error = false;</b>

<b>      }</b>

<b>      else</b>

<b>        Error = true;</b>

<b>    }</b>

<b>  }</b>

<b>  // Возвратить логическое значение true, если </b>

<b>  // индекс находится в установленных границах, </b>

<b>  private bool ok(int index) {</b>

<b>    if (index &gt;= lowerBound &amp; index &lt;= upperBound) return true;</b>

<b>    return false;</b>

<b>  }</b>

<b>}</b>

<b>// Продемонстрировать применение массива с произвольно </b>

<b>// задаваемыми пределами индексирования, </b>

<b>class RangeArrayDemo {</b>

<b>  static void Main() {</b>

<b>    RangeArray ra = new RangeArray(-5, 5);</b>