猪拉丁文字翻译器插入重复字符

时间:2019-03-22 20:16:20

标签: c# arrays string loops

我正在创建一个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;
    }
}

2 个答案:

答案 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);
}