【问题标题】:checking each char in string is outputted in wrong order?检查字符串中的每个字符是否以错误的顺序输出?
【发布时间】:2020-12-29 14:34:34
【问题描述】:

我试图将一个字符串拆分为一个字符(我已经完成了一半)并使用每个字符将它与我的充满随机字符串的字典进行比较,然后将字典中的字符值添加到完成的字符串中。问题在于它的输出 - 字符不按顺序排列。

例如:用户输入:“你好”---

例如:控制台:“e”-“l”-“l”-“o”-“h”

多数情况下就是这样。关于如何让它在控制台中正确拼写的任何答案?

代码:

private void complete_text_Click(object sender, RoutedEventArgs e)
{
    end_result = input_box.Text.ToString();
    string end_translated_result = "";
    for (int i = 0; i < ZENOX_LANGUAGE.Keys.Count; i ++)
    {

        foreach (char iq in end_result.ToCharArray())
        {
            
            
            if (iq.ToString().ToLower() == ZENOX_LANGUAGE.Keys.ElementAt(i).ToString().ToLower())
            {
                Console.WriteLine(iq);
                end_translated_result += ZENOX_LANGUAGE.Values.ElementAt(i) + " ";
                
                //Console.WriteLine("sender: " + sender.ToString() + " c: " + end_result[iq].ToString().ToLower() + " s:" + ZENOX_LANGUAGE.Keys.ElementAt(i));
               Console.WriteLine("end translated result: " + end_result);
                
            }
            
        }
    }
}

【问题讨论】:

  • @RyanWilson 非常奇怪,哈哈:pastebin.pl/view/1801bd19
  • 我必须查一下,但我想我记得 Dictionary 不会总是按照它们的存储顺序返回值对,因为它使用哈希,你可以使用OrderedDictionaryList&lt;T&gt;KeyValuePair 或在 Dictionary 上致电 Enumerable.OrderBy,如果您需要精确的订单。您可以在此相关帖子中阅读更多信息 (stackoverflow.com/questions/13998185/…)
  • 翻转循环内/外,然后查找ZENOX_LANGUAGE[iq]。并且不要使用ToLower(),使用Equals()StringComparison
  • @RyanWilson 字典不是我所知道的问题 - 它将 end_result 拆分并将其吐到控制台中。
  • @deadgunner 你确定吗?您是否逐步完成了 Dictionary 的迭代并确保它按顺序返回每个项目?您也可以使用传统的 for 循环迭代字符串,因为字符串是 char 的数组

标签: c# string visual-studio dictionary


【解决方案1】:

就目前而言,字典中键的顺序将影响输出出现的顺序,因为您正在这样做:

foreach(var k in dictionary.Keys)
  foreach(char c in someString)
    if(c == k) 
      Console.Write(c)

并且字典键没有定义的顺序。

交换循环将意味着(只要字典具有您要查找的键,因为它是导致打印字符的条件)输出将按字符串中的字符顺序显示..

..但我实际上无法弄清楚为什么要枚举键然后运行循环查找字符。如果我正在构建某种翻译映射,我只需遍历字符串并使用 char 来索引字典:

var map = new Dictionary<char, char>() {
  { 'h', 'Z' }, 
  { 'e', 'Y' }, 
  { 'l', 'X' }, 
  { 'o', 'W' } 
};

var toTrans = "hello";
foreach(char c in toTrans)
  Console.Write(map[c]);

这将为输入“hello”打印“ZYXXW”;

如果您将字符映射到字符串,并且不区分大小写,那么简单如下:

var map = new Dictionary<char, string>() {
  { 'h', "Z0" }, 
  { 'e', "Y0" }, 
  { 'l', "X0" }, 
  { 'o', "W0" } 
};

var toTrans = "HelLO";
foreach(char c in toTrans)
  Console.Write(map[Char.ToLower(c)]);

这将打印“Z0Y0X0X0W0”

【讨论】:

  • 我的程序需要第二个 for 循环来获取该索引处的 KEY 和该索引处的 VALUE。我想我通过在此处更改一行来尝试您的方法:end_translated_result += ZENOX_LANGUAGE[iq.ToString()] + " "; 你说的地方 Console.write(map[c])。输出拼写为 I N P T U - 仍然有一个混乱。**如果要拆分的字符顺序正确,则字典将是正确的**。请告诉我,因为我今天写了很多代码,所以你的答案是否错误。
  • 现在我做了一些更改,发现char[] end_charArray = end_result.ToCharArray(); 在我在这里使用它时在一定程度上有所帮助:for(int iq = 0; iq &lt; end_charArray.ToString().Length; iq++) 但 var iq 每运行 4 次只会增加 1。喜欢这里:"0"0"0"0"1"1"1"1"2"2" 等我也替换了 end_result 的所有引用到 end_charArray 喜欢这里:end_translated_result += ZENOX_LANGUAGE[end_charArray[iq].ToString().ToUpper()] + " ";
  • 您不能通过调用 ToString() 将 char 数组转换为字符串。 end_charArray.ToString() 的结果是 "System.Char[]" 即对象的类型,而不是数组的内容。我认为您可能需要停止编码,退一步思考您希望实现的目标
  • 让它工作,但这是一种糟糕的工作方式-foreach (char c in end_charArray) { if (counter &lt; end_result.Length) { counter++; end_translated_result += ZENOX_LANGUAGE[c.ToString().ToUpper()] + " "; Thread.Sleep(200); Console.WriteLine("end translated result: " + end_translated_result); } else { return; } }
  • “输出拼写为 INPTU” - 对于“hello”的输入字符串是不可能的 - 如果输入,我的代码不可能产生全唯一字母的输出有重复的字母。 hello 真正映射到 ZYXXW,就像我说的那样,看:dotnetfiddle.net/KZwSqh
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多