Pig Latin Translator 吐出多行? C#
Pig Latin Translator spitting out multiple lines? C#
所以我有一个支持多个单词的 Pig Latin Translator。但是每当我输入一些单词时(例如,我们只使用 "banana apple shears chocolate Theodore train"。)它会正确地吐出翻译的单词,但它会重复!这是我的代码:
namespace Pig_Latin_Translator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<string> vowels = new List<string>();
List<string> specials = new List<string>();
private void TranslateButton_Click(object sender, EventArgs e)
{
String[] parts = TranslateBox.Text.Split();
foreach (string s in specials)
{
if (TranslateBox.Text.Contains(s) || TranslateBox.Text == "\"")
{
TranslateOutput.Text = "";
MessageBox.Show("No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
break;
}
else
{
foreach (String part in parts)
{
foreach (String v in vowels)
{
if (part.Substring(0, 1) == v)
{
TranslateOutput.Text = TranslateOutput.Text + " " + part + "ay";
break;
}
else
{
if (part.Substring(0, 2) == "sh" || part.Substring(0, 2) == "ch" || part.Substring(0, 2) == "th" || part.Substring(0, 2) == "tr")
{
string SwitchP = part.Substring(2) + part.Substring(0, 2);
TranslateOutput.Text = TranslateOutput.Text + " " + SwitchP + "ay";
break;
}
else
{
string Switch = part.Substring(1) + part.Substring(0, 1);
TranslateOutput.Text = TranslateOutput.Text + " " + Switch + "ay";
break;
}
}
}
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
vowels.Add("a");
vowels.Add("e");
vowels.Add("i");
vowels.Add("o");
vowels.Add("u");
specials.Add("`");
specials.Add("1");
specials.Add("2");
specials.Add("3");
specials.Add("4");
specials.Add("5");
specials.Add("6");
specials.Add("7");
specials.Add("8");
specials.Add("9");
specials.Add("0");
specials.Add("-");
specials.Add("=");
specials.Add("[");
specials.Add("]");
specials.Add(@"\");
specials.Add(";");
specials.Add("'");
specials.Add(",");
specials.Add(".");
specials.Add("/");
specials.Add("~");
specials.Add("!");
specials.Add("@");
specials.Add("#");
specials.Add("$");
specials.Add("%");
specials.Add("^");
specials.Add("&");
specials.Add("*");
specials.Add("(");
specials.Add(")");
specials.Add("_");
specials.Add("+");
specials.Add("{");
specials.Add("}");
specials.Add("|");
specials.Add(":");
specials.Add("\"");
specials.Add("<");
specials.Add(">");
specials.Add("?");
}
private void AboutButton_Click(object sender, EventArgs e)
{
MessageBox.Show("Pig Latin is a fake language. It works by taking the first letter (Or two if it's a pair like 'th' or 'ch') and bringing it to the end, unless the first letter is a vowel. Then add 'ay' to the end. So 'bus' becomes 'usbay', 'thank' becomes 'ankthay' and 'apple' becomes 'appleay'.", "About:", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
如果你输入 "banana apple shears chocolate Theodore train" 输出:
"ananabay appleay earsshay ocolatechay heodoreTay aintray" 重复 10 次以上。
顺便说一句:如果您不能回答,我深表歉意,因为我知道有很多代码。不过没关系,因为这东西还是有用的。只是它不应该发生,让我心烦意乱。我知道还有很多问题,还有很多事情要做,但我想先解决这个问题。
您正在为每个特殊字符迭代一次您的单词。您的 foreach
用于检查您的文字并翻译在您的 foreach
内部以检查文本框是否包含任何特殊字符。
换句话说,您将为每个特殊字符进行一次翻译。
您需要将 foreach (String part in parts)
移出 foreach (string s in specials)
你的循环有点逻辑问题。
你的外循环:
foreach( string s in specials ) {
...正在遍历特殊字符列表中的所有 42 个字符。
你的内部循环
foreach( String part in parts ) {
...然后执行了 42 次。因此,对于您的六个单词示例,您实际上进行了 252 次猪拉丁语转换。
如果你从外部提取内部循环,你的结果会更好。像这样:
foreach( string s in specials ) {
if( TranslateBox.Text.Contains( s ) || TranslateBox.Text == "\"" ) {
TranslateOutput.Text = "";
MessageBox.Show( "No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning );
return;
}
}
String[] parts = TranslateBox.Text.Split();
foreach( String part in parts ) {
foreach( String v in vowels ) {
if( part.Substring( 0, 1 ) == v ) {
TranslateOutput.Text = TranslateOutput.Text + " " + part + "ay";
break;
}
else {
if( part.Substring( 0, 2 ) == "sh" || part.Substring( 0, 2 ) == "ch" || part.Substring( 0, 2 ) == "th" || part.Substring( 0, 2 ) == "tr" ) {
string SwitchP = part.Substring( 2 ) + part.Substring( 0, 2 );
TranslateOutput.Text = TranslateOutput.Text + " " + SwitchP + "ay";
break;
}
else {
string Switch = part.Substring( 1 ) + part.Substring( 0, 1 );
TranslateOutput.Text = TranslateOutput.Text + " " + Switch + "ay";
break;
}
}
}
}
一个更简洁的实现是:
private void TranslateButton_Click( object sender, EventArgs e )
{
char[] specials = "`1234567890-=[]\";',./~!@#$%^&*()_+{}|:\<>?".ToArray();
char[] vowels = "aeiou".ToArray();
TranslateOutput.Text = String.Empty;
if( TranslateBox.Text.IndexOfAny( specials ) > -1 ) {
MessageBox.Show( "No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning );
return;
}
String[] parts = TranslateBox.Text.Split();
foreach( String part in parts ) {
int firstVowel = part.IndexOfAny( vowels );
if( firstVowel > 0 ) {
TranslateOutput.Text += part.Substring( firstVowel ) + part.Substring( 0, firstVowel ) + "ay ";
}
else {
TranslateOutput.Text += part + "ay ";
}
}
TranslateOutput.Text = TranslateOutput.Text.TrimEnd();
}
在这个例子中,我为特殊字母和元音字母创建了两个字符数组。然后我可以利用框架的 IndexOfAny
方法来搜索数组中的任何字符和 return 第一次出现的索引。这将在第一个循环中找到第一个特殊字母(如果有的话),并在第二个循环中找到第一个元音。一旦我从单词中获得了字符索引,我就可以将该单词解析为 pig Latin。请注意,我正在检查零作为元音索引,因为在 pig Latin 中,一个前导元音保持在原处并且 "ay" 只是附加到单词的末尾。
您将代码嵌套在不应嵌套的两个循环中
foreach (string s in specials)
和
foreach (String v in vowels)
你的 break
陈述一方面让你摆脱了麻烦,另一方面却没有。
使用 .Any(...)
谓词可以完全避免这些循环。
您的代码可能如下所示:
private void TranslateButton_Click(object sender, EventArgs e)
{
TranslateOutput.Text = "";
if (specials.Any(s => TranslateBox.Text.Contains(s)))
{
MessageBox.Show("No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
String[] parts = TranslateBox.Text.Split();
foreach (var part in parts)
{
var index = 1;
if (vowels.Any(v => part.Substring(0, 1).ToLower() == v))
{
index = 0;
}
else if (new [] { "sh", "ch", "th", "tr", }.Contains(part.Substring(0, 2).ToLower()))
{
index = 2;
}
TranslateOutput.Text += " " + part.Substring(index) + part.Substring(0, index);
}
}
TranslateOutput.Text = TranslateOutput.Text.TrimEnd();
}
这将它归结为您实际需要的一个 foreach
循环。
你也可以让你的代码初始化 vowels
和 specials
到这个:
vowels.AddRange("aeiou".Select(x => x.ToString()));
specials.AddRange(@"`1234567890-=[]\;',./~!@#$%^&*()_+{}|:""<>?".Select(x => x.ToString()));
所以我有一个支持多个单词的 Pig Latin Translator。但是每当我输入一些单词时(例如,我们只使用 "banana apple shears chocolate Theodore train"。)它会正确地吐出翻译的单词,但它会重复!这是我的代码:
namespace Pig_Latin_Translator
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
List<string> vowels = new List<string>();
List<string> specials = new List<string>();
private void TranslateButton_Click(object sender, EventArgs e)
{
String[] parts = TranslateBox.Text.Split();
foreach (string s in specials)
{
if (TranslateBox.Text.Contains(s) || TranslateBox.Text == "\"")
{
TranslateOutput.Text = "";
MessageBox.Show("No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
break;
}
else
{
foreach (String part in parts)
{
foreach (String v in vowels)
{
if (part.Substring(0, 1) == v)
{
TranslateOutput.Text = TranslateOutput.Text + " " + part + "ay";
break;
}
else
{
if (part.Substring(0, 2) == "sh" || part.Substring(0, 2) == "ch" || part.Substring(0, 2) == "th" || part.Substring(0, 2) == "tr")
{
string SwitchP = part.Substring(2) + part.Substring(0, 2);
TranslateOutput.Text = TranslateOutput.Text + " " + SwitchP + "ay";
break;
}
else
{
string Switch = part.Substring(1) + part.Substring(0, 1);
TranslateOutput.Text = TranslateOutput.Text + " " + Switch + "ay";
break;
}
}
}
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
vowels.Add("a");
vowels.Add("e");
vowels.Add("i");
vowels.Add("o");
vowels.Add("u");
specials.Add("`");
specials.Add("1");
specials.Add("2");
specials.Add("3");
specials.Add("4");
specials.Add("5");
specials.Add("6");
specials.Add("7");
specials.Add("8");
specials.Add("9");
specials.Add("0");
specials.Add("-");
specials.Add("=");
specials.Add("[");
specials.Add("]");
specials.Add(@"\");
specials.Add(";");
specials.Add("'");
specials.Add(",");
specials.Add(".");
specials.Add("/");
specials.Add("~");
specials.Add("!");
specials.Add("@");
specials.Add("#");
specials.Add("$");
specials.Add("%");
specials.Add("^");
specials.Add("&");
specials.Add("*");
specials.Add("(");
specials.Add(")");
specials.Add("_");
specials.Add("+");
specials.Add("{");
specials.Add("}");
specials.Add("|");
specials.Add(":");
specials.Add("\"");
specials.Add("<");
specials.Add(">");
specials.Add("?");
}
private void AboutButton_Click(object sender, EventArgs e)
{
MessageBox.Show("Pig Latin is a fake language. It works by taking the first letter (Or two if it's a pair like 'th' or 'ch') and bringing it to the end, unless the first letter is a vowel. Then add 'ay' to the end. So 'bus' becomes 'usbay', 'thank' becomes 'ankthay' and 'apple' becomes 'appleay'.", "About:", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
如果你输入 "banana apple shears chocolate Theodore train" 输出:
"ananabay appleay earsshay ocolatechay heodoreTay aintray" 重复 10 次以上。
顺便说一句:如果您不能回答,我深表歉意,因为我知道有很多代码。不过没关系,因为这东西还是有用的。只是它不应该发生,让我心烦意乱。我知道还有很多问题,还有很多事情要做,但我想先解决这个问题。
您正在为每个特殊字符迭代一次您的单词。您的 foreach
用于检查您的文字并翻译在您的 foreach
内部以检查文本框是否包含任何特殊字符。
换句话说,您将为每个特殊字符进行一次翻译。
您需要将 foreach (String part in parts)
移出 foreach (string s in specials)
你的循环有点逻辑问题。
你的外循环:
foreach( string s in specials ) {
...正在遍历特殊字符列表中的所有 42 个字符。
你的内部循环
foreach( String part in parts ) {
...然后执行了 42 次。因此,对于您的六个单词示例,您实际上进行了 252 次猪拉丁语转换。
如果你从外部提取内部循环,你的结果会更好。像这样:
foreach( string s in specials ) {
if( TranslateBox.Text.Contains( s ) || TranslateBox.Text == "\"" ) {
TranslateOutput.Text = "";
MessageBox.Show( "No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning );
return;
}
}
String[] parts = TranslateBox.Text.Split();
foreach( String part in parts ) {
foreach( String v in vowels ) {
if( part.Substring( 0, 1 ) == v ) {
TranslateOutput.Text = TranslateOutput.Text + " " + part + "ay";
break;
}
else {
if( part.Substring( 0, 2 ) == "sh" || part.Substring( 0, 2 ) == "ch" || part.Substring( 0, 2 ) == "th" || part.Substring( 0, 2 ) == "tr" ) {
string SwitchP = part.Substring( 2 ) + part.Substring( 0, 2 );
TranslateOutput.Text = TranslateOutput.Text + " " + SwitchP + "ay";
break;
}
else {
string Switch = part.Substring( 1 ) + part.Substring( 0, 1 );
TranslateOutput.Text = TranslateOutput.Text + " " + Switch + "ay";
break;
}
}
}
}
一个更简洁的实现是:
private void TranslateButton_Click( object sender, EventArgs e )
{
char[] specials = "`1234567890-=[]\";',./~!@#$%^&*()_+{}|:\<>?".ToArray();
char[] vowels = "aeiou".ToArray();
TranslateOutput.Text = String.Empty;
if( TranslateBox.Text.IndexOfAny( specials ) > -1 ) {
MessageBox.Show( "No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning );
return;
}
String[] parts = TranslateBox.Text.Split();
foreach( String part in parts ) {
int firstVowel = part.IndexOfAny( vowels );
if( firstVowel > 0 ) {
TranslateOutput.Text += part.Substring( firstVowel ) + part.Substring( 0, firstVowel ) + "ay ";
}
else {
TranslateOutput.Text += part + "ay ";
}
}
TranslateOutput.Text = TranslateOutput.Text.TrimEnd();
}
在这个例子中,我为特殊字母和元音字母创建了两个字符数组。然后我可以利用框架的 IndexOfAny
方法来搜索数组中的任何字符和 return 第一次出现的索引。这将在第一个循环中找到第一个特殊字母(如果有的话),并在第二个循环中找到第一个元音。一旦我从单词中获得了字符索引,我就可以将该单词解析为 pig Latin。请注意,我正在检查零作为元音索引,因为在 pig Latin 中,一个前导元音保持在原处并且 "ay" 只是附加到单词的末尾。
您将代码嵌套在不应嵌套的两个循环中
foreach (string s in specials)
和
foreach (String v in vowels)
你的 break
陈述一方面让你摆脱了麻烦,另一方面却没有。
使用 .Any(...)
谓词可以完全避免这些循环。
您的代码可能如下所示:
private void TranslateButton_Click(object sender, EventArgs e)
{
TranslateOutput.Text = "";
if (specials.Any(s => TranslateBox.Text.Contains(s)))
{
MessageBox.Show("No Special Characters!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
else
{
String[] parts = TranslateBox.Text.Split();
foreach (var part in parts)
{
var index = 1;
if (vowels.Any(v => part.Substring(0, 1).ToLower() == v))
{
index = 0;
}
else if (new [] { "sh", "ch", "th", "tr", }.Contains(part.Substring(0, 2).ToLower()))
{
index = 2;
}
TranslateOutput.Text += " " + part.Substring(index) + part.Substring(0, index);
}
}
TranslateOutput.Text = TranslateOutput.Text.TrimEnd();
}
这将它归结为您实际需要的一个 foreach
循环。
你也可以让你的代码初始化 vowels
和 specials
到这个:
vowels.AddRange("aeiou".Select(x => x.ToString()));
specials.AddRange(@"`1234567890-=[]\;',./~!@#$%^&*()_+{}|:""<>?".Select(x => x.ToString()));