|
Программирование >> Программирование с использованием ajax
Цикл foreach предоставляет доступ ко всем элементам в многомерном массиве, точно так же как и в одномерных массивах: double[,] hillHeight = {{1, 2, 3, 4}, [2, 3, 4, 5}, {3, 4, 5, 6}}; foreach (double height in hillHeight) Console.WriteLine( {0} , height); Порядок, в котором элементы выводятся, совпадает с тем, что использовался для присваивания литеральных значений: hillHeight[0,0] hillHeight[0,l] hillHeight[0,2] hillHeight[0,3] hillHeight[l,0] hillHeight[l,l] hillHeight[1,2] Массивы массивов Многомерные массивы, о которых рассказывалось в предыдущем разделе, считаются прямоугольными, потому что каждая строка имеет одинаковый размер. Например, в последнем рассмотренном случае любой из возможных координат х могла соответствовать координата у от О до 3. Однако массивы еще могут быть зубчатыми, т.е. строки могут иметь разные размеры. Для этого каждый элемент в массиве должен являться тоже массивом. При желании можно также создавать и массивы массивов, состоящие из прочих массивов, или даже еще более сложные массивы. Однако все эти варианты возможны только при условии наличия у массивов одного и того же базового типа. Синтаксис для объявления массивов, состоящих из массивов, подразумевает указание в объявлении массива нескольких пар квадратных скобок: int[][] jaggedlntArray; К сожалению, инициализация подобных массив не является такой же простой процедурой, как инициализация многомерных массивов. Например, за приведенным выше объявлением ни в коем случае не может следовать такая строка кода: jaggedlntArray = new int[3][4]; Даже если бы это было возможно, приведенная строка не была бы особенно полезной, поскольку того же эффекта в случае использования многомерных массивов можно добиться и с гораздо меньшими усилиями. Нельзя применять и такую строку кода: jaggedlntArray = {{1, 2, 3}, {1}, {1, 2}}; Существуют всего два возможных варианта. Первый - инициализировать сначала массив, содержащий другие массивы (которые далее для ясности будут называться просто подмассивами), а затем по очереди инициализировать подмассивы: jaggedlntArray = new int[2][]; jaggedlntArray[0] = new int[3]; jaggedlntArray[1] = new int[4]; Второй вариант - использовать модифицированную версию приводившейся выше операции литерального присваивания: jaggedlntArray = new int[3] [] {new int[] {1, 2, 3}, new int[] {1}, new int[] {1, 2}};
Выполнение следующего кода завершится ошибкой: foreach (int divisor in divisorslTolO) { Console.WriteLine(divisor); Объясняется это тем, что массив divisorslTolO содержит элементы int [ ], а не int. Поэтому вместо этого в цикле нужно проходить по каждому подмассиву, а также по самому массиву: foreach (int[] divisorsOfInt in divisorslTolO) { foreach(int divisor in divisorsOfInt) { Console.WriteLine(divisor); Как видно, синтаксис для использования зубчатых массивов может быстро становится довольно сложным. Из-за этого в большинстве случаев проще использовать прямоугольные массивы или какой-то другой более простой метод хранения. Однако все же могут встречаться ситуации, в которых без применения таких массивов не обойтись, и в таких ситуациях наличие соответствующих навыков совсем не повредит. Манипулирование строками Показанные до сих пор способы применения строк подразумевали лишь вывод строк в окне консоли, считывание строк из окна консоли и конкатенацию строк с помощью операции +. В процессе программирования более интересных приложений очень быстро станет очевидным, что манипулирование строками является одной из наиболее часто выполняемых операций. Из-за этого будет совсем не лишним потратить несколько страниц на рассмотрение некоторых наиболее распространенных приемов манипулирования строками, которые доступны в языке С#. Для начала обратим внимание на то, что переменная типа string может восприниматься как доступный только для чтения массив переменных char. Это означает, что доступ к отдельным символам можно получать с использованием приблизительно такого синтаксиса: Инициализировать массив можно и в той же строке, в которой он объявляется: int[] [] jaggedlntArray = (new int [] {1, 2, 3}, new int [ ] {!}, new int [] {1, 2}}; С зубчатыми массивами можно использовать циклы f oreach, но их часто нужно делать вложенными для того, чтобы они добирались до фактических данных. Например, предположим, что имеется показанный ниже зубчатый массив, содержащий 10 других массивов, каждый из которых, в свою очередь, тоже содержит массив целых чисел, представляющих собой делители целого числа в диапазоне от 1 до 10: int[] [] divisorslTolO = string myString = А string ; char myChar = myString [1]; Однако присваивать отдельные символы подобным образом нельзя. Для получения массива char, пригодного для выполнения записи, можно применять показанный ниже код. В этом коде задействована такая команда переменной массива, как ToCharArray О: string myString = А string ; char[] myChars = myString.ToCharArray (); После этого массивом char можно начинать манипулировать обычным образом. Также еще можно использовать строки в циклах foreach, как показано ниже: foreach (char character in myString) { Console.WriteLine( {0} , character); Как и в случае массивов, получать информацию о количестве элементов в строке также можно с помощью myString. Length: string myString = Console.ReadLine (); Console.WriteLine ( You typed {0} characters. , myString.Length); Другие базовые приемы манипулирования строками подразумевают использование команд в формате, подобном <строка>. ToCharArray (). К числу наиболее простых, но полезных из них относятся команды <строка>. ToLower () и <строка>. ToUpper (). Эти две команды позволяют преобразовывать строки, соответственно, в нижний и в верхний регистр. Чтобы понять, что в этом полезного, давайте предположим, что требуется обеспечить выполнение проверки на предмет наличия конкретного ответа от пользователя, например, строки yes. Преобразование вводимой пользователем строки в нижний регистр позволит также выполнять проверку на предмет наличия и таких строк, как YES, Yes, yeS и т.д. - подобный пример уже приводился в предыдущей главе. string userResponse = Console.ReadLine (); if (userResponse.ToLower0 == yes ) Выполнение действия в ответ. Эта команда, подобно прочим командам в настоящем разделе, на самом деле не изменяет ту строку, к которой применяется. Вместо этого комбинирование этой команды со строкой приводит к созданию новой строки, которая может далее либо сравниваться с еще какой-нибудь строкой (как это делается здесь), либо присваиваться другой переменной. В роли этой другой переменной может выступать та же самая переменная, над которой выполняются операции: userResponse = userResponse.ToLower(); Очень важно запомнить этот момент, поскольку использование просто такой строки кода: userResponse.ToLower() ; на самом деле не позволит получить никаких особых результатов. Существуют и другие вещи, которые можно делать для упрощения интерпретации вводимых пользователем данных. Что если пользователь случайно введет в начале или в конце входных данных лишний пробел? В таком случае приведенный код работать
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |