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;
}

}

第二版:我没有必要在这里投赞成票。但是,感谢你们所有人一百万次!我预计在下周内会得到一两个答案,所以不得不说我被这里的社区淹没了。再次感谢!

for循环克隆输出

由于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。