1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 40
Текст из файла (страница 40)
W r i t e L i n e ( " И м я ' {0} ' п о с л е о б р а б о т к и " , s) ;}II Ожидаем подтверждения пользователяConsole.WriteLine("Нажмите <Enter> для " +"завершения программы. . . " ) . ;Console.Read();}Глава 9. Работа со строками в С#213// TrimAndPad - для данного массива строк удаляются// пробелы с обоих сторон строки, после чего выполняется// дополнение пробелов таким образом, чтобы все строки// о к а з а л и с ь в ы р о в н е н ы с н а и б о л ь ш е й с т р о к о й в м а с с и в еp u b l i c s t a t i c string[] T r i m A n d P a d ( s t r i n g [] strings){// К о п и р у е м и с х о д н ы й м а с с и в в м а с с и в , с к о т о р ы м будем// работатьstring[] stringsToAlign = new String[strings.Length];////Удаляем ненужныестрокиf o r ( i n t i = 0;пробелысобоихсторонi < stringsToAlign.Length;каждойi++){stringsToAlign[i]= strings[i].Trim();}// Находим наибольшую длинуi n t n M a x L e n g t h = 0;foreach(stringsinстрокивмассивеstringsToAlign){if(s.Length> nMaxLength){nMaxLength=s.Length;}}//Выравниваемf o r ( i n t i = 0;всестрокикдлинесамой длиннойi < stringsToAlign.Length;i++){stringsToAlign[i] =stringsToAlign[i].PadRight(nMaxLength + 1 ) ;}// Возвращаем результатreturn stringsToAlign;}}вызывающейфункции}Демонстрационная программа A l i g n O u t p u t определяет массив имен, которые шеиразные выравнивание и длину (вы можете переписать программу так, чтобы эти имена счипвались с клавиатуры или из файла).
Функция M a i n () сначала выводит эти имена на экрантом виде, в котором они получены программой. Затем вызывается функция TrimAndPadсущественно улучшающая внешний вид выводимых программой строк:Имена имеют разную длинуИмя 'Christa' до о б р а б о т к иИмя 'S a r a h ' до обработкиИмя 'Jonathan' до обработкиИ м я 'Sam' д о о б р а б о т к и1Имя ' Schmekowitzдо о б р а б о т к и214ЧастьIII.Объектно-основанноепрограммировяТe же и м е н а в ы р о в н е н ы и и м е ю т о д и н а к о в у ю д л и н уимя 'Christa' после обработкиВия 'Sarah' после обработкиta 'Jonathan' после обработкиИмя 'Sam' после обработкиИмя 'Schmekowitz ' п о с л е о б р а б о т к иНажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы .
. .Метод T r i m A n d P a d ()начинает ссозданиякопиипереданногоему массиваstrings. В общем случае функция, работающая с переданными ей аргументами, должна вернуть новые модифицированные значения, а не изменять переданные ей.TrimAndPad () начинается с цикла, вызывающего T r i m () для каждого элементамассива, чтобы удалить лишние пробельные символы с обоих концов строки.
Затем выполняется второй цикл, в котором происходит поиск самого длинного элемента массива.И наконец, в последнем цикле для элементов массива вызывается метод P a d R i g h t ( ) ,удлиняющий строки, делая их равными по длине.Метод P a d R i g h t (10) увеличивает строку так, чтобы ее длина была как минимум10 символов.Например,если длина исходной строки — 6символов,тометодPadRight (10) добавит к ней справа еще 4 пробела.Метод T r i m A n d P a d () возвращает массив выровненных строк для вывода. Функцияlain () проходит по полученному списку строк, выводя их на экран. Вот и все.Использование функции конкатенацииЗачастую программисты сталкиваются с задачей разбивки строки или вставки некоторой подстроки в середину другой строки.
Заменить один символ другим проще всего(помощью метода R e p l a c e ():string s = " D a n g e r N o S m o k i n g " ;а.Replace (s, ' ' , ' ! ' )Этотфрагмент исходноготекста преобразует начальнуюстроку в"Danger!NoSmoking".Замена всех вхождений одного символа (в данном случае — пробела) другим(восклицательным знаком) особенно полезна при генерации списка элементов, разделении запятыми для упрощения разбора. Однако более распространенный и сложный случай включает разбиение единой строки на подстроки, отдельную работу с каждой подстрокой с последующим объединением их в единую модифицированную строку.Рассмотрим, например, функцию R e m o v e S p e c i a l C h a r s ( ) , которая удаляет все встречающиеся специальные символы из передаваемой ей строки.Демонстрационная программа R e m o v e W i t h S p a c e использует функциюR e m o v e S p e c i a l C h a r s () для удаления из строки пробельных символов(пробелов, табуляций и символов новой строки).// RemoveWhiteSpaceопределениефункции// RemoveSpecialChars () ,котораяможетудалятьиз//передаваемой е й с т р о к и п р о и з в о л ь н ы й п р е д о п р е д е л е н н ы й// набор с и м в о л о в .
В д а н н о й д е м о н с т р а ц и о н н о й п р о г р а м м е/ / функцияиспользуетсядляудаленияизтестовойстроки//пробельныхсимволовnamespace R e m o v e W h i t e S p a c eвсех'та 9. Работа со строками в С#215*usingSystem;publicclassProgram{publicstatic void Main(string[]args){// Определение множества пробельных символовc h a r t ] c W h i t e S p a c e = {' ', ' \ n ' , ' \ t ' } ;// Начинаем работу со строкой, в которой имеются// пробельные символыs t r i n g s = " t h i s is a \ n s t r i n g " ;Console.WriteLine("До:" + s ) ;// Выводим строку с удаленными пробельными символамиConsole.WriteLine("После : " +RemoveSpecialChars(s, cWhiteSpace))// Ожидаем подтверждения пользователяConsole.WriteLine("Нажмите <Enter> для " +" з а в е р ш е н и я п р о г р а м м ы . .
. ") ;Console.Read();}// R e m o v e S p e c i a l C h a r s - у д а л я е т из строки все указанные// символыpublic static string RemoveSpecialChars(string slnput,c h a r t ] cTargets){// В sOutput будет содержатьсяstring sOutput = slnput;// Начинаем поиск пробельныхfor(;;)возвращаемаястрокасимволов{// Ищем позиции искомых символов; если таковых в// строке больше нет — выходим из циклаint n O f f s e t = s O u t p u t .
I n d e x O f A n y ( c T a r g e t s ) ;if ( n O f f s e t-1){break;}// Разбиваем строку на две части — до найденного// с и м в о л а и п о с л е н е г оstring sBefore = sOutput.Substring(0, n O f f s e t ) ;string sAfter= sOutput.Substring(nOffset + 1 ) ;// и объединяем эти части, но уже без найденного// символаsOutput = String.Concat(sBefore, s A f t e r ) ;216Часть III.Объектно-основанное программировавIГлавreturnsOutput;Ключевой в этой демонстрационной программе является функция R e m o v e S p e c i a l Chars ( ) . Она возвращает строку, которая представляет собой исходную строку, но судаленными вхождениями всех символов, содержащихся в массиве c T a r g e t s . Чтобылучше понять эту функцию, представьте, что ей передана строка " a b , c d , е " , а массивспециальных символов содержит единственный символ ' ,1.Функция R e m o v e S p e c i a l C h a r s () начинается с входа в цикл, выход из которогопроизойдет только тогда, когда в строке не останется ни одной запятой.
Функция 1пdexOf Any () возвращает позицию первой найденной запятой (значение -1 указывает,то ни одна запятая не найдена).После первого вызова I n d e x O f A n y () возвращает 2 (позиция111а равна 0, позицияb — 1, а позиция ' , ' — 2). Два следующих вызова функции разбивают строку на двеподстроки в указанном месте. Вызов S u b s t r i n g (0, 2) создает подстроку, содержащую два символа,начинаяс символа в позиции 0,т.е."ab".ВторойвызовSubstring (3) создает подстроку из символов с позиции 3 исходной строки и до ееюнца, т.е.
" c d , e " (+1 в вызове позволяет пропустить найденную запятую). Затемфункция Concat () объединяет эти подстроки вместе, создавая строку " a b e d , е".Управление выполнением передается после этого в начало цикла. Очередная итераднл находит запятую в позиции 4, так что в результате получается строка " a b e d e " . Поскольку в ней нет ни одной запятой, возвращаемая при последнем проходе позиция равиа-1.Демонстрационная программа сначала выводит строку, содержащую пробельныесиволы, затем использует функцию R e m o v e S p e c i a l C h a r s () для их удаления и выводит получившуюся в результате строку:|о: this is аWringПосле :thisisastringЗажмите <Enter> д л я з а в е р ш е н и я п р о г р а м м ы .
. .Использование ф у н к ц и и SplitQВ программе R e m o v e W h i t e S p a c e было продемонстрировано применениеметодов C o n c a t ( ) и I n d e x O f ( ) ; однако использованный способ решенияпоставленной задачи не самый эффективный. Стоит только немного подумать, и можно получить существенно более эффективную функцию с использованием уже знакомой функции S p l i t О. Соответствующая программаимеетсянаприлагаемомкомпакт-дискевкаталогеRemove-W h i t e S p a c e W i t h S p l i t . Вот код функции R e m o v e S p e c i a l C h a r s () изэтой программы.// RemoveSpecialChars - у д а л я е т из с т р о к и в с е у к а з а н н ы е// символыr a b l i c static s t r i n g R e m o v e S p e c i a l C h a r s ( s t r i n g s l n p u t ,char[] cTargets)ированиеtoa ft Работа со строками в С#217// Разбиваем входную строку с использованием указанных// символов в качестве р а з д е л и т е л е йstring[] sSubStrings = s l n p u t .
S p l i t ( c T a r g e t s ) ;// В sOutput будет содержатьсяstring sOutput = "";// Цикл по всем подстрокамforeach(string substring inвозвращаемаястрокаsSubStrings){sOutput=String.Concat(sOutput,substring);}returnsOutput;}В этой версии для разбиения входной строки на множество подстрок используфункция S p l i t ()с удаляемыми символами в качестве символов-разделителей,скольку разделители не включаются в подстроки, создается эффект их удаления,логика гораздо проще и менее подвержена ошибкам при реализации.Цикл f o r e a c h в этой версии функции собирает части строки в единое целое. Впрограммы остается неизменным.Класс S t r i n g предоставляет в распоряжение программиста метод Format О]форматирования вывода, в основном — чисел.