Переписать в новую строку слова, в которых гласные буквы чередуются с согласными
Код готов, но выглядит, мягко говоря, страшно. Есть ли методы, которыми можно оформить проверку более элегантно? Эта длиннющая строка реально выглядит пугающе...
static void Alternation(string text)
{
string result = " Result: ";
//int i1 = 0, i2 = 0;
string[] S = text.Split(' ');
for (int i1 = 0; i1 <= S.Length - 1; i1++)
{
bool Check = false;
if (S[i1] != S[S.Length - 1])
for (int i2 = 0; i2 <= S[i1].Length - 2; i2++)
if (((S[i1][i2] == 'а' | S[i1][i2] == 'е' | S[i1][i2] == 'и' | S[i1][i2] == 'о' | S[i1][i2] == 'у' | S[i1][i2] == 'А' | S[i1][i2] == 'Е' | S[i1][i2] == 'И' | S[i1][i2] == 'О' | S[i1][i2] == 'У') & (S[i1][i2 + 1] == 'б' | S[i1][i2 + 1] == 'в' | S[i1][i2 + 1] == 'г' | S[i1][i2 + 1] == 'д' | S[i1][i2 + 1] == 'ж' | S[i1][i2 + 1] == 'з' | S[i1][i2 + 1] == 'й' | S[i1][i2 + 1] == 'к' | S[i1][i2 + 1] == 'л' | S[i1][i2 + 1] == 'м' | S[i1][i2 + 1] == 'н' | S[i1][i2 + 1] == 'п' | S[i1][i2 + 1] == 'р' | S[i1][i2 + 1] == 'с' | S[i1][i2 + 1] == 'т' | S[i1][i2 + 1] == 'ф' | S[i1][i2 + 1] == 'х' | S[i1][i2 + 1] == 'ц' | S[i1][i2 + 1] == 'ч' | S[i1][i2 + 1] == 'ш' | S[i1][i2 + 1] == 'щ' | S[i1][i2 + 1] == 'Б' | S[i1][i2 + 1] == 'В' | S[i1][i2 + 1] == 'Г' | S[i1][i2 + 1] == 'Д' | S[i1][i2 + 1] == 'Ж' | S[i1][i2 + 1] == 'З' | S[i1][i2 + 1] == 'Й' | S[i1][i2 + 1] == 'К' | S[i1][i2 + 1] == 'Л' | S[i1][i2 + 1] == 'М' | S[i1][i2 + 1] == 'Н' | S[i1][i2 + 1] == 'П' | S[i1][i2 + 1] == 'Р' | S[i1][i2 + 1] == 'С' | S[i1][i2 + 1] == 'Т' | S[i1][i2 + 1] == 'Ф' | S[i1][i2 + 1] == 'Х' | S[i1][i2 + 1] == 'Ц' | S[i1][i2 + 1] == 'Ч' | S[i1][i2 + 1] == 'Ш' | S[i1][i2 + 1] == 'Щ')) | ((S[i1][i2] == 'б' | S[i1][i2] == 'в' | S[i1][i2] == 'г' | S[i1][i2] == 'д' | S[i1][i2] == 'ж' | S[i1][i2] == 'з' | S[i1][i2] == 'й' | S[i1][i2] == 'к' | S[i1][i2] == 'л' | S[i1][i2] == 'м' | S[i1][i2] == 'н' | S[i1][i2] == 'п' | S[i1][i2] == 'р' | S[i1][i2] == 'с' | S[i1][i2] == 'т' | S[i1][i2] == 'ф' | S[i1][i2] == 'х' | S[i1][i2] == 'ц' | S[i1][i2] == 'ч' | S[i1][i2] == 'ш' | S[i1][i2] == 'щ' | S[i1][i2] == 'Б' | S[i1][i2] == 'В' | S[i1][i2] == 'Г' | S[i1][i2] == 'Д' | S[i1][i2] == 'Ж' | S[i1][i2] == 'З' | S[i1][i2] == 'Й' | S[i1][i2] == 'К' | S[i1][i2] == 'Л' | S[i1][i2] == 'М' | S[i1][i2] == 'Н' | S[i1][i2] == 'П' | S[i1][i2] == 'Р' | S[i1][i2] == 'С' | S[i1][i2] == 'Т' | S[i1][i2] == 'Ф' | S[i1][i2] == 'Х' | S[i1][i2] == 'Ц' | S[i1][i2] == 'Ч' | S[i1][i2] == 'Ш' | S[i1][i2] == 'Щ') & (S[i1][i2 + 1] == 'а' | S[i1][i2 + 1] == 'е' | S[i1][i2 + 1] == 'и' | S[i1][i2 + 1] == 'о' | S[i1][i2 + 1] == 'у' | S[i1][i2 + 1] == 'А' | S[i1][i2 + 1] == 'Е' | S[i1][i2 + 1] == 'И' | S[i1][i2 + 1] == 'О' | S[i1][i2 + 1] == 'У')))
Check = true;
else { Check = false; break; }
if (Check == true) result = result + ' ' + S[i1];
}
Console.WriteLine(result);
}
Ответы (1 шт):
Автор решения: tym32167
→ Ссылка
Я бы не стал делить строку на подстроки-слова, а выделял бы подстроки только когда необходимо. Также используйте подходяшие структуры данных типа HashSet когда вам надо узнать, входит ли буква в какое то множество. Также имейте ввиду, что конкатенация строк - операция дорогая.
Пример
static void Alternation(string text)
{
StringBuilder result = new StringBuilder();
result.Append( " Result: ");
HashSet<char> glasnye = new HashSet<char>("аеиоу");
HashSet<char> soglasye = new HashSet<char>("бвгджзйклмнпрстфхцчшщ");
int current = 0;
while(current < text.Length)
{
while(current < text.Length && text[current] == ' ') current++;
var wordStart = current;
var check = true;
int glasCount = 0;
int soglCount = 0;
while (current < text.Length && text[current] != ' ')
{
if (glasnye.Contains(char.ToLower(text[current]))) glasCount++;
if (soglasye.Contains(char.ToLower(text[current]))) soglCount++;
current++;
if(Math.Abs(glasCount - soglCount) >= 2) check = false;
}
if (check && wordStart < current) {
result.Append(" ");
result.Append(text.Substring(wordStart, current - wordStart));
}
}
Console.WriteLine(result.ToString());
}
Проверка
Alternation(" фафафа афафаф ааа ффф ффф аф");
Alternation(" фафафа афафаф ааа ффф ффф аф ");
Результат
Result: фафафа афафаф аф
Result: фафафа афафаф аф