我希望将bool
containsVowel返回到我的main方法中,如果一个单词包含一个元音,它将允许它存储到一个数组中。当我使用下面的代码时,方法名称出现错误,说"并非所有代码路径都返回值"。我也试过不使用for循环,以及char数组 - 它工作得很好但是如果我在表单中输入元音它仍然说没有找到元音。
private bool vowel(string word)
{
bool containsVowel = false;
char[] wordChar = word.ToCharArray();
for (int i = 0; i < word.Length; i++)
{
switch (wordChar[i])
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return containsVowel = true;
break;
default:
MessageBox.Show("Word must contain a vowel", "Error");
return containsVowel = false;
break;
}
}
}
答案 0 :(得分:1)
鉴于您的方法的返回类型为bool
而不是void
,所有代码路径都必须返回一个值。 C#编译器试图非常天真地评估所有代码路径,以查看您的方法是否从所有路径返回值。
您的方法对编译器来说是这样的:
start
for
switch
case
return
default
return
end
由于switch
,default
可以正常覆盖,但for
也是一个条件分支。如果您传递一个空字符串,则不会输入for
(i = 0
和word.Length = 0
,因此i < word.Length
从一开始就为假,所以在 for
之后,还需要一个return语句。
您可以通过执行以下操作来大规模改进代码:
public bool ContainsVowel(string word)
{
if (string.IsNullOrEmpty(word))
{
return false;
}
var upperCaseCharacters = word.ToUpper().ToCharArray();
foreach (var character in upperCaseCharacters)
{
switch (character)
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return true;
}
}
return false;
}
此代码检查传递的字符串是null
还是空,然后立即返回false
(快速失败)。然后它将字符串转换为大写一次,并使用foreach()
在字符数组上循环,这是迭代遍历集合的首选方法。然后它不会使用中间变量来存储结果,因为只要遇到元音就可以返回true
。
最后,当迭代所有字符后没有遇到元音时,该方法返回false。
然后在呼叫站点,您可以这样做:
if (!ContainsVowel(word))
{
MessageBox.Show("Word must contain a vowel", "Error");
}
因为这样的方法不应该包含消息框之类的UI逻辑。
答案 1 :(得分:0)
您的代码只检查了字符串的第一个字符,因为如果它是元音,它会跳出循环。这应该解决它,但为了更好的方法,请检查@ Sr82的答案
private bool vowel(string word)
{
bool containsVowel = false;
char[] wordChar = word.ToCharArray();
for (int i = 0; i < word.Length; i++)
{
switch (wordChar[i])
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return containsVowel = true;
//if you find a vowel, you can return true straight away
}
}
//if you dont find one, let the for loop finish. If it reaches this code you know
//there was no vowel found and you can proceed with your error report
MessageBox.Show("Word must contain a vowel", "Error");
return containsVowel = false;
}
答案 2 :(得分:0)
这段代码应该这样做。首先,检查一个空字值。然后你必须将你的单词转换为高位,以便检测所有元音,就是这个上面或下面。然后,你必须只检查一个元音,因为如果存在元音,该方法应该返回true。如果,在检查所有字母后,该方法没有检测到元音,显示错误消息并返回false:
private static bool vowel(string word)
{
if (word == null) return false;
char[] wordChar = word.ToUpper().ToCharArray();
for (int i = 0; i < word.Length; i++)
{
switch (word[i])
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return true;
break;
}
}
Console.WriteLine("Word must contain a vowel");
return false;
}
如您所见,此方法始终返回一个值。在你的代码中,如果传递的单词为空,它将不会进入for
循环,因此它不会返回任何内容。
答案 3 :(得分:0)
如果您正在尝试检查字符串是否包含元音,那就可以这样做:
private bool vowel(string word)
{
return word.ToLower().Any(x => "aeiou".Contains(x));
}
这使用LINQ,特别是Any method来确定字符串是否包含任何元音。最好将字符串设置为全部小写,以便您可以检查元音是否存在,无论是否存在。
答案 4 :(得分:0)
如果您可以使用Linq,这个简单的方法应该可行。 Intersect
方法采用两个char
序列,并返回两个都存在的char
序列。如果序列中有任何内容,Any
方法将返回true。
using System.Linq;
void Main()
{
string s = "Word";
if (hasVowels(s))
{
Console.WriteLine("Word has vowels");
}
else
{
Console.WriteLine("Word does not have vowels");
}
}
//The `Intersect` method takes two `char` sequences and returns a sequence
//of `char` that exists in both of them. The `Any` method returns true if
//there is anything in the resulting sequence.
private bool hasVowels(string word)
{
string vowels = "AEIOUaeiou";
return word != null && word.Intersect(vowels).Any();
}