Глава 12. Коллекции. Обобщения
269
// Метод GetLowerBound(0) возвращает нижнюю границу
// индексов первого измерения массива Array,
// а метод GetLowerBound(Rank — 1) — нижнюю
// границу последнего измерения массива Array.
for (int i = myArr.GetLowerBound(0); i <=
myArr.GetUpperBound(0); i++) // для 1-го измерения
for (int j = myArr.GetLowerBound(1); j <=
myArr.GetUpperBound(1); j++) // для 2-го измерения
for (int k = myArr.GetLowerBound(2); k <=
myArr.GetUpperBound(2); k++) // для 3-го измерения
{
// Установка значений элементов массива
// по его индексам:
myArr.SetValue((12*i)+(4*j)+k, i, j, k);
}
/* Если это элементы по каждой размерности:
1,2; 1,2,3; 1,2,3,4, то картина трехмерного
массива такая:
1,1,1, 1,1,2, 1,1,3, 1,1,4
1,2,1, 1,2,2, 1,2,3, 1,2,4
1,3,1, 1,3,2, 1,3,3, 1,3,4
2,1,1, 2,1,2, 2,1,3, 2,1,4
2,2,1, 2,2,2, 2,2,3, 2,2,4
2,3,1 2,3,2, 2,3,3, 2,3,4
*/
// Печать свойств массива типа Array.
Console.WriteLine("Массив имеет размерность {0} и элементов
{1} ", myArr.Rank, myArr.Length);
Console.WriteLine("\tДлина\tНижняя граница\tВерхняя граница");
for (int i = 0; i < myArr.Rank; i++) // Индекс
// меняется от нуля до размерности — 1
{
Console.Write("{0}:\t{1}", i, myArr.GetLength(i));
Console.WriteLine("\t\t{0}\t\t{1}",
myArr.GetLowerBound(i),
myArr.GetUpperBound(i));
}
// Печать содержимого массива
Console.WriteLine("Значения элементов массива:");
270
Часть II. Объектно-ориентированное программирование
PrintValues(myArr);
Console.Read();
}
public static void PrintValues(Array myArr)
{
// Интерфейс IEnumerable уже входит в класс Array,
// поэтому для создания перечислителя его к классу
// подключать не надо:
System.Collections.IEnumerator myEnumerator =
myArr.GetEnumerator();
int i = 0;
int cols = myArr.GetLength(myArr.Rank — 1);
// Количество колонок данных: GetLength(0) дает кол-во
// элементов в первом измерении, поэтому стоит Rank-1.
// Когда перечислитель выйдет за пределы массива,
// он выдаст false, и цикл закончится:
while (myEnumerator.MoveNext()) // Первое движение
// MoveNext попадает на первый элемент,
// поэтому i идет синхронно: 1, 2
{ if (i < cols)
{ i++; // Вывод 4-х элементов очередной строки
}
else
{ Console.WriteLine();
i = 1; // Возврат счетчика на начало вывода
// следующей строки
}
Console.Write("\t{0}", myEnumerator.Current); // Вывод
// текущего элемента массива (проход по строкам)
} // while
Console.WriteLine();
}
}
}
Работа программы пояснена по тексту.
Do'stlaringiz bilan baham: |