#c_sharp #linq
Есть текст, из которого надо взять слова начинающиеся с большой буквы. решИла нЕ Упрощать и зашифРОВАтЬ Все послаНИЕ дАже не Старайся нИЧЕГО у тЕбя нЕ получится с расшифРОВкой Сдавайся НЕ твоего ума Ты не споСОбЕн Но может быть если особенно упорно подойдешь к делу будет Трудно конечнО Код ведЬ не из простых очень ХОРОШИЙ код то у тебя все получится и я буДу Писать тЕбЕ еще чао мой код data.Split(' ').Select(x => x).Where(x=>char.IsUpper(x[0])).Reverse().ToList(); Почему то он не берет все слова которые начинаются с большой буквы. Мой результат Писать ХОРОШИЙ Трудно Но Ты НЕ Старайся Все Упрощать А должно получиться Писать ХОРОШИЙ Код Трудно Но Ты НЕ Сдавайся Старайся Все Упрощать Что в моем коде не так*
Ответы
Ответ 1
Думаю, проблема в том, что вы делите по пробелу, а нужно включить в разделяющие символы ещё и конец строки (и Tab, наверное). Ещё одна потенциальная проблема: Вы берёте первый символ слова, не проверив длину слова. Ну и конструкция Select(x => x) не изменяет последовательность и таким образом не нужна.Ответ 2
Можно решить проблему поиска разделителей, табов, переносов строк и прочих запятых через регулярные выражения: string pattern = @"\b\p{Lu}.*?\b"; var words = Regex.Matches(data, pattern) .Cast().Select(m => m.Value).Reverse(); Console.WriteLine(String.Join(" ", words)); \b - граница слова \p{Lu} - большая буква .*? - любые символы, но как можно меньше (т.е. очередное \b совпадет с ближайшей границей слова) Ответ 3
data.Split(' ', '\n') .Where(x => !string.IsNullOrEmpty(x)) .Where(x => char.IsUpper(x[0])) .Reverse(); Добавил в разделители перенос строки и проверку на то, что строка не пустая, как советовал VladD, теперь работает правильно.
Комментариев нет:
Отправить комментарий