Вы можете использовать Regex.Replace:
Regex r = new Regex("[aAeEiIoOuU]");
//or Regex r = new Regex("[aeiou]", RegexOptions.IgnoreCase);
string[] names = new string[5];
names[0] = "john";
names[1] = "samuel";
names[2] = "kevin";
names[3] = "steve";
names[4] = "martyn";
for (int i = 0; i < names.Length; i++)
{
names[i] = r.Replace(names[i], "");
Console.WriteLine("The output is:" + names[i]);
}
Чтобы сделать свой оригинальный подход работы вам необходимо добавить вызов string.Replace:
names[i] = names[i].Replace(vowels[j], "");
Это означает, что «замените любые события vowels[j]
на names[i]
и назначьте результат names[i]
».
Однако вы в настоящее время объявляете массив массивов имен внутри вашей петли гласных, чтобы не получить ожидаемый результат, если вы добавите заменяющий код.
Вы также перемещаетесь вокруг гласных, а затем имен; логически, вероятно, имеет смысл отменить это - это, безусловно, облегчает вывод результатов. Нечто подобное должно работать для вас:
string[] vowels = new string[] { "A", "a", "E", "e", "I", "i", "O", "o", "U", "u" };
string[] names = new string[5];
names[0] = "john";
names[1] = "samuel";
names[2] = "kevin";
names[3] = "steve";
names[4] = "martyn";
for (int i = 0; i < names.Length; i++)
{
for (int j = 0; j < vowels.Length; j++)
{
names[i] = names[i].Replace(vowels[j], "");
}
Console.WriteLine("The output is:" + names[i]);
}
Редактировать
В комментариях ОП просили пример без использования Replace
. Вот один из таких методов (@Eser имеет другой в their answer). Этот подход выполняет итерацию каждого символа входной строки до тех пор, пока не найдет гласную. В этот момент символы, которые не были прочитаны до этого (за исключением гласной) добавляют к StringBuilder
:
public static string RemoveVowels(string name)
{
StringBuilder noVowels = new StringBuilder();
//keep track of the last index we read
int lastIndex = 0;
int i;
for (i = 0; i < name.Length; i++)
{
if (vowels.Contains(name[i]))
{
//the current index is a vowel, take the text from the last read index to this index
noVowels.Append(name, lastIndex, i - lastIndex);
lastIndex = i + 1;
}
}
if (lastIndex < i)
{
//the last character wasn't a vowel so we need to add the rest of the string here.
noVowels.Append(name, lastIndex, name.Length - lastIndex);
}
return noVowels.ToString();
}
Описанный выше метод может быть вызван для каждого имени в массиве:
for (int i = 0; i < names.Length; i++)
{
Console.WriteLine("The output is:" + RemoveVowels(names[i]));
}
Что касается того, какой подход к использованию, я бы пошел с тем, который вы найдете наиболее читаемым, если у вас нет конкретных требований к производительности, в какой момент, я думаю, вам нужно будет измерить каждый подход и выбрать тот, который лучше всего соответствует вашим требованиям.
Вы сравниваете гласные со всем именем. вам нужно либо перебрать каждую букву каждого имени для сравнения гласных, либо использовать [string.contains] (https://msdn.microsoft.com/en-us/library/dy85x1sa (v = vs.110) .aspx). Кроме того, вы можете просто сохранить одну версию каждого гласного (вместо верхнего нижнего) и обработать случай в сравнении –
изменить 'if (гласные [j] == имена [i])' to 'names [i] .Replace (гласные [j], ''); ' – Les
Вы должны ToUpper() строку перед началом разбора гласных и содержать только гласные в верхнем регистре в строке [] гласных. Это должно улучшить производительность. – PeonProgrammer