Петля над массивом неизвестного измерения в C#

Предыдущий пост Loop над записями в массиве неизвестной длины в C# объясняет, как перебирать записи в одномерном или двумерном массиве, но что вы будете делать, если не знаете, сколько измерений имеет массив? По общему признанию, это необычная ситуация, но даже в этом случае вы можете перебирать значения, чтобы принять меры на них.

В этом примере используется следующий код для инициализации трехмерного массива и отображения его текстового представления. Метод ArrayTextValue, который описывается в скором времени, пересекает массив для создания текстового представления.

Один из самых больших трюков здесь - это то, что вы хотите делать со значениями. В этом примере я решил создать строку, показанную на картинке. Он отображает каждый размер массива с отступом и окружен фигурными фигурными скобками, несколько похожим на предыдущий код, который инициализирует массив. Самый внутренний уровень массива отображается в одной строке со значениями, заключенными в круглые скобки.

предыдущий пост < / a> использует вложенные петли для для итерации по размерам двумерного массива. Поскольку мы не знаем, сколько измерений имеет массив в этом примере, эта стратегия не будет работать. Вы могли бы попытаться сделать огромную серию вложенных циклов, а затем сделать ненужными ничего не делать, но это было бы сложно, запутанно и негибко.

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

В следующем коде показан метод ArrayTextValue, который создает текстовое представление.

Этот код использует свойство массива Rank, чтобы получить количество измерений массива. Затем он заставляет массив удерживать индексы для каждого измерения. Например, если есть 4 измерения, и массив индексов содержит значения {2, 3, 3, 5}, тогда код рассматривает значения массива [2, 3, 3, 5] .

Затем метод вызывает метод GetArrayTextValues для выполнения реальной работы, передавая ему массив, количество, на которое он должен отступать от текста (изначально 0), массива индексов, индекса в массив, который GetArrayTextValues должен учитывать. Этот код передает 0 для окончательного аргумента, поэтому GetArrayTextValues начинается с назначения первого индекса в массиве индексов.

В следующем коде показан метод GetArrayTextValues.

Этот метод отвечает за рекурсию. Он начинается с создания строки, которая правильно отступом для этого уровня массива. Затем он получает верхнюю границу для рассматриваемого измерения и делает переменную i петлей над диапазоном значений, допустимых для этого измерения. Для каждого значения индекса в этом измерении программа проверяет, рассматривает ли он измерение второго по величине массива.

Если это второе измерение, код вызывает метод GetInnermostData, чтобы получить представление последнего измерения данных - измерение, которое содержит фактические данные, которые должны отображаться в одна строка вывода.

Если это не второе измерение, метод вызывает себя рекурсивно для обработки следующего измерения массива.

Следующий код показывает метод GetArrayInnermostData.

Этот метод довольно прост. Он получает верхнюю границу для окончательного измерения и петли над своим диапазоном, соединяя значения массива.

Источник: http://csharphelper.com/blog/2016/12/loop-over-an-array-of-unknown-dimension-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)

Add a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *