我正在创建一个c#Windows Forms应用程序以将英语文本转换为Pig Latin,但是该程序将最后一个字母(如果是辅音)插入五次,而不是一个字母。
我可以使用if语句在文本末尾插入“ way”,该语句检查第一个字母是否为元音。但是,当我检查单词是否不是元音时,我的问题就开始了。
string[] vowels = new string[5] { "a", "e", "i", "o", "u" };
private void BtnTranslate_Click(object sender, EventArgs e)
{
string TextEnglish = txtEnglish.Text;
for (int i = 0; i < vowels.Length; i++)
{
if (TextEnglish.StartsWith(vowels[i]))
{
TextEnglish = TextEnglish.Insert(TextEnglish.Length, "way");
}
else if(!TextEnglish.StartsWith(vowels[i]))
{
string TextEnglishSubstring = TextEnglish.Substring(0, 1);
TextEnglish = TextEnglish.Insert(TextEnglish.Length, TextEnglishSubstring);
TextEnglish = TextEnglish.Insert(TextEnglish.Length, "ay");
}
//string substringToInsert = TextEnglish.Substring(0, 1);
//TextEnglish = TextEnglish.Insert(TextEnglish.Length, "c");
txtPigLatin.Text = TextEnglish;
}
}
答案 0 :(得分:1)
您正在针对每个可能的元音检查第一个字符,而并非所有字符都在检查它,并且您正在运行代码以针对每个被检查的元音进行一次转换。
相反,您应该首先检查它是否是元音,设置一个标志,然后执行转换逻辑。有几种方法可以解决此问题,下面是一个示例:
string TextEnglish = txtEnglish.Text;
bool startsWithVowel = vowels.Any(v => TextEnglish.StartsWith(v));
if(startsWithVowel)
{
// Do vowel logic
}
else
{
// Do consonant logic
}
答案 1 :(得分:1)
首先,我建议您创建一个单独的方法来返回猪拉丁翻译,然后从您的按钮单击事件中调用该方法。这样可以更好地重复使用代码,并可以使代码更简洁。
问题是您要遍历元音数组中的所有项目,并为每次迭代更改文本。相反,您要做的只是简单地确定单词是否以元音开头。同样,这可以用另一种方法编写(更多的代码封装,这意味着如果需要的话,也可以在其他地方重用)。
请注意,我将元音写为string
,但可以将其视为char[]
(因为这实际上就是字符串),这里的窍门是看是否数组Contains
输入字符串的第一个字符:
public static bool BeginsWithAVowel(string input)
{
if (string.IsNullOrWhiteSpace(input)) return false;
var vowels = "AaEeIiOoUu";
return vowels.Contains(input.Substring(0, 1));
}
现在,我们可以使用此方法在我们的猪拉丁转换方法中测试字符串:
public static string ConvertToPigLatin(string input)
{
if (string.IsNullOrWhiteSpace(input)) return input;
if (BeginsWithAVowel(input))
{
// Add "way" to the end of the string and return it
return input + "way";
}
// Remove the first character and add it, plus "ay", to the end and return it
return input.Substring(1) + input.Substring(0, 1) + "ay";
}
现在,在按钮单击事件中,我们要转换文本所需要做的就是用原始文本调用方法,然后将Text
属性设置为结果:
private void BtnTranslate_Click(object sender, EventArgs e)
{
txtPigLatin.Text = ConvertToPigLatin(txtEnglish.Text);
}