Я попытался создать программу, которая подсчитывает гласные в предложении.
В моем коде я использовал оператор foreach
с оператором if/else if
. Я хотел бы преобразовать эту строку кода, используя оператор switch
но я не уверен, куда идти. Нужно ли добавлять новый метод? Буду признателен за вашу помощь.
Это то, что я пробовал до сих пор: я проверил, что это очень неправильно. Например, для case 1
должна быть константа. Я не уверен, какую константу я буду использовать здесь.
foreach (char v in yourSentence)
{
switch (v)
{
case 1:
(v==ch1);
counta++;
j++;
break;
case 2:
(v==ch2);
counte++;
j++;
break;
case 3:
(v==ch3);
counti++;
j++;
break;
case 4:
(v==ch4);
counto++;
j++;
break;
case 5:
(v==ch3);
counti++;
j++;
break;
}
}
Другой вопрос: я попытался изменить цвет текста дисплея в listBox. Возможно ли иметь разные цвета? То, что я также пробовал здесь, это первые 5 (listBox1.Items.Add
) фиолетовые. И сумма (listBox1.Items.Add
) - синяя. Но, похоже, это не изменилось. Я что-то пропустил?
private void btnCount_Click(object sender, EventArgs e)
{
string yourSentence;
yourSentence = textBoxVowels.Text.ToLower().Trim();
char ch1 = 'a';
char ch2 = 'e';
char ch3 = 'i';
char ch4 = 'o';
char ch5 = 'u';
int counta = 0;
int counte = 0;
int counti = 0;
int counto = 0;
int countu = 0;
int j = counta + counte + counti + counto + countu;
foreach (char v in yourSentence)
{
if (v == ch1) { counta++; j++; }
else if (v == ch2) { counte++; j++; }
else if (v == ch3) { counti++; j++; }
else if (v == ch4) { counto++; j++; }
else if (v == ch5) { countu++; j++; }
}
listBox1.Items.Add("There are " + counta.ToString().Trim() + " a in the sentence");
listBox1.Items.Add("There are " + counte.ToString().Trim() + " e in the sentence");
listBox1.Items.Add("There are " + counti.ToString().Trim() + " i in the sentence");
listBox1.Items.Add("There are " + counto.ToString().Trim() + " o in the sentence");
listBox1.Items.Add("There are " + countu.ToString().Trim() + " u in the sentence");
listBox1.Font = new Font("Arial", 12, FontStyle.Bold);
listBox1.ForeColor = Color.Violet;
listBox1.Items.Add("There are " + j.ToString().Trim() + " vowels in the sentence");
listBox1.ForeColor = Color.Blue;
}
private void btnClear_Click(object sender, EventArgs e)
{
textBoxVowels.Text = null;
listBox1.Items.Clear();
}
Я думаю, вы неправильно поняли, как работает "switch/case". Просто измените их на это:
case 'a':
counta++;
j++;
break;
Для случая требуется постоянное значение, которое следует сравнить с текущим символом.
Или просто упростите всю проблему, используя бит LINQ.:)
public static int CountVowels(this string value)
{
const string vowels = "aeiou";
return value.Count(chr => vowels.Contains(char.ToLower(chr)));
}
Метод расширения Count
особенно хорошо подходит для этой задачи. Также обратите внимание на использование строки всех гласных для проверки каждого символа - намного проще, чем оператор switch.
Примечание. Кажется, я пропустил тот факт, что вы хотите считать каждую гласную индивидуально. В этом случае LINQ становится немного сложнее (по крайней мере, если вы хотите сделать это эффективно), но я оставлю это как упражнение для вас. Несмотря на это, оператор switch, вероятно, является хорошим способом изучения основ С#.
Так как вам все-таки любопытно в отношении оператора switch, следующий код использует правильный синтаксис:
foreach (var chr in sentence)
{
switch (chr)
{
case 'a':
...
break;
case 'e':
...
break;
case 'i':
...
break;
case 'o':
...
case 'u':
...
break;
}
}
Здесь более продвинутое решение:
public static Dictionary<char, int> CountLetters(string value, string letters)
{
var counts = letters.ToDictionary(c => c.ToString(), c => 0, StringComparer.OrdinalIgnoreCase);
var groups = from c in value
let s = c.ToString()
where counts.ContainsKey(s)
group s by s;
foreach(var g in groups)
counts[g.Key] = g.Count();
return counts;
}
Что вы можете использовать следующим образом:
var letterCounts = CountLetters(yourSentence, "aeiou");
int countA = letterCounts["a"];
int countE = letterCounts["e"];
int countI = letterCounts["i"];
int countO = letterCounts["o"];
int countU = letterCounts["u"];
int total = countA + countE + countI + countO + countU;
Обновление: Просто понял, что StringComparer
не будет работать для клавиш char
. Переход на string
- не так эффективен, как char
, но проще, чем писать нечувствительный к регистру char
. Я предпочитаю метод сравнения, чтобы делать какой-то ToLower/ToUpper во всех словарях.
Пожалуйста, также проверьте другие ответы на свои вопросы для получения многих полезных советов. Я просто переписываю ваш первый пример кода примера из вашего вопроса, чтобы, вероятно, позволить ему делать то, что вы имеете в виду:
foreach (char v in yourSentence)
{
switch (v)
{
case 'a': counta++; j++; break;
case 'e': counte++; j++; break;
case 'i': counti++; j++; break;
case 'o': counto++; j++; break;
case 'u': countu++; j++; break;
}
}
Кажется, вы хотите увеличить одну из переменных { counta, counte, counti, counto, countu }
для пяти конкретных гласных с помощью переключателя (справа?), а также увеличить переменную j
для каждой из гласных.
Дав этот ответ, я лично сделал бы что-то совсем другое. Как пример LINQ, данный Нолдорином. Или что-то вроде этого, возможно, предложенное cherryalpha:
// create dictionary
var counts = new Dictionary<char,int>();
// initialize it for the vowels
foreach (char v in "aeiuo")
{
counts.Add(v, 0);
}
// count all characters in sentence
foreach (char v in yourSentence) {
if ( counts.ContainsKey(v) ) {
// increase count for known characters
counts[v]++;
} else {
// add new count for characters not seen previously
counts.Add(v,1);
}
}
// calculate your total number of vowels
j = counts['a'] + counts['e'] + counts['i'] + counts['o'] + counts['u'];
Быстрое предупреждение, на всякий случай: вам понадобится using System.Collection.Generic
в верхней части исходного файла, который содержит этот код, чтобы убедиться, что общий словарь известен по его короткому имени.
(И имейте в виду, что этот код будет не только давать вам подсчеты гласных, но и считать все остальные символы в yourSentence
.)
В интервью я столкнулся с подобной проблемой. Но я должен был показать свой результат в контроле уровня вместо управления списком... поэтому я решил эту проблему следующим образом:
protected void Button1_Click(object sender, EventArgs e)
{
string EnterString;
EnterString = TextBox1.Text;
char ch1 = 'a';
char ch2 = 'e';
char ch3 = 'i';
char ch4 = 'o';
char ch5 = 'u';
int counta = 0;
int counte = 0;
int counti = 0;
int counto = 0;
int countu = 0;
char ch6 = 'A';
char ch7 = 'E';
char ch8 = 'I';
char ch9 = 'O';
char ch10 = 'U';
int countA = 0;
int countE = 0;
int countI = 0;
int countO = 0;
int countU = 0;
int j = counta + counte + counti + counto + countu + countA + countE + countI + countO + countU;
foreach (char v in EnterString)
{
if (v == ch1) { counta++; j++; }
else if (v == ch2) { counte++; j++; }
else if (v == ch3) { counti++; j++; }
else if (v == ch4) { counto++; j++; }
else if (v == ch5) { countu++; j++; }
}
foreach (char v in EnterString)
{
if (v == ch6) { countA++; j++; }
else if (v == ch7) { countE++; j++; }
else if (v == ch8) { countI++; j++; }
else if (v == ch9) { countO++; j++; }
else if (v == ch10) { countU++; j++; }
}
Label1.Text = j.ToString();
}
const string VOWELS = "aeiou";
var str = "Lorem ipsum dolor sit amet";
var q = from ch in str
where VOWELS.Contains(ch)
group ch by ch into g
select g;
var dict = q.ToDictionary(_ => _.Key, _ => _.Count());