我试图设计一个程序来计算句子中的元音。
在我的代码中,我使用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's in the sentence");
listBox1.Items.Add("There are " + counte.ToString().Trim() + " e's in the sentence");
listBox1.Items.Add("There are " + counti.ToString().Trim() + " i's in the sentence");
listBox1.Items.Add("There are " + counto.ToString().Trim() + " o's in the sentence");
listBox1.Items.Add("There are " + countu.ToString().Trim() + " u's 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();
}
答案 0 :(得分:9)
或者只是使用一点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语句可能是学习C#基础知识的好方法。
由于您可能对switch语句感到好奇,因此以下代码使用了正确的语法:
foreach (var chr in sentence)
{
switch (chr)
{
case 'a':
...
break;
case 'e':
...
break;
case 'i':
...
break;
case 'o':
...
case 'u':
...
break;
}
}
答案 1 :(得分:5)
我认为你误解了'开关/案例'是如何运作的。只需将它们更改为:
case 'a':
counta++;
j++;
break;
大小写需要一个应与当前字符进行比较的常量值。
答案 2 :(得分:4)
这是一个更高级的解决方案:
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。
答案 3 :(得分:2)
请查看其他问题的答案以获取许多有用的提示。我只是从你的问题重写你的第一段示例代码,可能让它按你的意思行事:
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
变量。
在给出这个答案之后,我会亲自做一些不同的事情。就像Noldorin给出的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
中所有其他字符的数量。)
答案 4 :(得分:1)
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());
答案 5 :(得分:1)
我在面试中遇到了类似的问题。但是我必须在水平控制而不是列表框控件中显示我的结果...所以我解决了这个问题:
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();
}