【问题标题】:How should I take an input, check against a dictionary, and if it matches replace with the definition?我应该如何输入,检查字典,如果它匹配替换为定义?
【发布时间】:2016-02-21 04:34:16
【问题描述】:

获取输入、检查字典以及是否匹配替换为定义的最佳方法是什么?

我正在尝试制作一个莫尔斯电码转换器,我决定使用字典来存储莫尔斯电码翻译。不过,我正在努力想出根据输入检查字典的最佳方法。

我可以做类似...

If unconvertedInput = morseDic commaMorse

但是,我认为这将非常低效。或者字典不是去这里的方式?我只是不确定。

这也是我不完整的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MorseCodeConverter
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Dictionary<string, string> morseDictonary = new Dictionary<string, string>();
            morseDictonary.Add(" ", " ");
            morseDictonary.Add(",", "--..--");
            morseDictonary.Add(".", ".-.-.-");

            string spaceMorse = morseDictonary[" "];
            string commaMorse = morseDictonary[","];
            string periodMorse = morseDictonary["."];
            MessageBox.Show(spaceMorse);
        }
    }
}

【问题讨论】:

  • 你能提供一个示例输入和输出吗?
  • 大概您一次只能替换一个字符,对吧?听起来您应该创建一个新的 StringBuilder 并一次遍历输入一个字符,附加原始字符或字典中的值。顺便说一句,每次按下按钮时,您的字典都将是相同的 - 所以您不妨将它放在静态变量中。
  • 你想把莫尔斯电码转成文本还是反过来
  • 为什么你认为它效率低下?即使在现实生活中,你也会做类似的操作。事实上,我已经多次被警告过这类问题可能会被否决。

标签: c#


【解决方案1】:

我认为这是最简单的方法:

var morseDictonary = new Dictionary<char, string>()
{
    { '.', ".-.-.-" },
    { ',', "--..--" },
    { ' ', " " },
    { 'A', ".-" },
    { 'B', "-..." },
};

var example = "A , B .";

var result = String.Join("", example.Select(x => morseDictonary[x]));

我得到这个结果:

.- --..-- -... .-.-.-

【讨论】:

    【解决方案2】:

    听起来您实际上想要字典的 static 变量,因为它不会随着时间而改变。然后我会使用 StringBuilder 来构建结果,而不是尝试替换字符串 within 中的文本。 (字符串是不可变的,无论如何这都是一个棘手的命题——当您将输入和输出严格分开时,生活通常会更简单。)

    就效率而言,使用StringBuilder 会很好 - 字典查找将非常有效。如果您知道您只处理 ASCII 文本,您可以拥有一个 string[] 并改为按 ASCII 值对其进行索引,这样效率会更高......但我会坚持除非您要翻译 大量 文本,否则暂时不要使用字典。 (对于任何合理数量的文本,它仍然会在眨眼间发生。)

    public class MorseCodeTranslationForm
    {
        private static readonly Dictionary<char, string> Translations =
            new Dictionary<char, string>
            {
                { 'A', ".-" },
                { 'B', "-..." },
                // etc 
            };
    
        // Normal constructor etc
    
        // Call this from an event handler...
        private static string ConvertToMorse(string text)
        {
            StringBuilder builder = new StringBuilder();
            foreach (char c in text)
            {
                string translated;
                if (Translations.TryGetValue(c, out translation))
                {
                    builder.Append(translated).Translate(' ');
                }
                else
                {
                    builder.Append(c); // Just leave it as it is                    
                }
            }
            return builder.ToString();
        }
    }
    

    (您可能还想将 UI 代码与莫尔斯翻译的“业务逻辑”分开,但那是另一回事。)

    【讨论】:

      【解决方案3】:

      这可能会有所帮助。

      请注意,您必须先执行句点 (.),并且不能转换破折号 (-),否则它们也会被替换。

              Dictionary<string, string> morseDictonary = new Dictionary<string, string>();
              morseDictonary.Add(".", ".-.-.-");  //*** Important: Do this first ***
              morseDictonary.Add(",", "--..--");
              morseDictonary.Add(" ", " ");
              morseDictonary.Add("A", ".-");
              morseDictonary.Add("B", "-...");
              //...
      
              string example = "A , B .";
      
              foreach(KeyValuePair<string, string> pair in morseDictonary)
              {
                  example = example.Replace(pair.Key, pair.Value);
              }
      
              //example = ".- --..-- -... .-.-.-"
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      相关资源
      最近更新 更多