for循环克隆输出
本文关键字:输出 循环 for | 更新日期: 2023-09-27 17:57:39
我对C#非常陌生,您可能会从我的问题中注意到这一点。我一直在做一个"Røverspråk"翻译来学习一些基础知识。"Røverspråk"有点像猪拉丁语:规则是你用辅音+"o"+辅音来交换每个辅音。到目前为止,一切都很好,这一部分很有效。当我试图把它翻译回来时,我的问题就来了。
"totimom"应该返回"tim",但返回的却是:"ttttttttttttttttttttttttttttttttttttttiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiimmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"
。所以它会将每个字母返回38次——与我的konsonant字符串(挪威konsonants)中的数量相同;
string kons="BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz";
为什么它每38次就返回一次?据我所知,for循环是分开的,就像在我的翻译器中一样。给我带来麻烦的代码:
public void OversettTilbake(string vok, string kons)
{
string nyText = textBox2.Text.ToString().ToLower();
for (int e = 0; e < nyText.Length; e++)
{
for (int f = 0; f < kons.Length; f++)
{
if (nyText[e] == kons[f])
{
newText2.Add(nyText[e].ToString());
e = e + 2;
}
}
for (int g = 0; g < kons.Length; g++)
{
if (nyText[e] != kons[g])
{
newText2.Add(nyText[e].ToString());
}
}
}
}
翻译工作:
public int Oversetter(string text, string vok, string kons)
{
int Count = 0;
char tom = ' ';
for (int e = 0; e < text.Length; e++)
{
for (int i = 0; i < kons.Length; i++)
{
if (text[e] == kons[i])
{
newText.Add((text[e]).ToString() + "o" + (text[e]).ToString().ToLower());
Count = Count + 1;
}
}
for (int i = 0; i < vok.Length; i++)
{
if (text[e] == vok[i])
{
newText.Add((text[e]).ToString());
Count = Count + 1;
}
}
if (text[e] == tom)
{
newText.Add(text[e].ToString() + (text[e].ToString()));
}
for (int i = 0; i < tegn.Length; i++)
{
if (text[e] == tegn[i])
{
newText.Add((text[e]).ToString());
}
}
}
return Count;
}
编辑:感谢所有精彩的输入。我真的学到了很多。这个来自@cahinton的解决方案似乎运行得很好,对我来说并不难理解和实现:
for(var e = 0; e < nyText.Length; e += 1) {
newText2.Add(nyText[e].ToString);
if(kons.Contains(nyText[e])) {
e += 2;
}
}
第二版:我没有必要在这里投赞成票。但是,感谢你们所有人一百万次!我预计在下周内会得到一两个答案,所以不得不说我被这里的社区淹没了。再次感谢!
由于g循环,您得到了所有重复项。对于每一个不匹配的辅音,你都要将你要查看的字符添加到你的目标字符串中。代码可以简化如下:
for(var e = 0; e < nyText.Length; e += 1) {
newText2.Add(nyText[e].ToString());
if(kons.Contains(nyText[e])) {
e += 2;
}
}
您可以通过将kons从String
更改为HashSet
的chars:来提高Contains
查找性能
HashSet<char> kons = new HashSet<char>() {'B', 'C', 'D', /* etc... */ };
试试这个
public string OversettTilbake(string kons)
{
string nyText = textBox2.Text.ToString().ToLower();
for (int f = 0; f < kons.Length; f++)
nyText = nyText.Replace((kons[f] + "o" + kons[f]), kons[f].ToString());
return nyText;
}
问题是"g"循环:几乎每个辅音都会出现不匹配。
相反,修改"f"循环,将"find"布尔值设置为"true"(在循环之前初始化为"false")。如果没有找到辅音,它就是元音(或其他字符),所以你可以加一次。
编辑
int e = 0;
while (e < nyText.Length) // changed 'for' into 'while'
{
bool found = false;
for (int f = 0; f < kons.Length; f++)
{
if (nyText[e] == kons[f])
{
newText2.Add(nyText[e].ToString());
e = e + 3;
found = true;
break; // break out of the 'for' loop: no need to test further after a match
}
}
// no need for an extra 'mismatch-loop'
if (!found)
{
newText2.Add(nyText[e].ToString());
e = e + 1;
}
}
以下代码有效,甚至只需要一个循环,因为您可以使用IndexOf
在字符串中搜索。还请注意,由于您的辅音数组定义为同时包含大写和小写字母,因此没有理由将输入转换为小写。第三,不应该在方法中使用TextBox
,而应该将要转换的字符串作为参数传入。
static string kons = "BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz";
public static string OversettTilbake(string nyText)
{
int stringIndex = 0;
string result = String.Empty;
while (stringIndex < nyText.Length)
{
result += nyText[stringIndex];
if (kons.IndexOf(nyText[stringIndex]) > -1)
{
stringIndex += 3;
}
else
{
stringIndex++;
}
}
return result;
}
称之为
Console.WriteLine(OversettTilbake("Totimom"));
事实上,您的代码很容易简化为只使用一个循环,因为规则是用3个字母替换一个辅音。所以你所需要做的就是,每当你遇到一个辅音时,把它加到结果中,跳过两个字母。就是这样。
请注意,在TextBox.Text
上调用ToString
是不必要的,因为Text
已经是一个字符串。
var newText2 = new StringBuilder();
string nyText = "totesostot1";
const string kons = "BCDFGHJKLMNPQRSTVWZbcdfghjklmnpqrstvwz";
// Loop through each leter
for (int e = 0; e < nyText.Length; e++)
{
// Print the letter
newText2.Append(nyText[e].ToString(CultureInfo.InvariantCulture));
// If the letter exists in kons, skip the next 2 letters
if (kons.Any(t => nyText[e] == t))
{
e = e + 2;
}
}
Console.WriteLine(newText2);
将输出test1。