【问题标题】:Better use HashTable or switch case更好地使用 HashTable 或 switch case
【发布时间】:2012-02-14 13:09:20
【问题描述】:

我不确定哪个更好。我需要解析输入字符串的每个字符并获取该字符的替换字符串。对于某些对象,所有字母数字字符都是允许的,因此使用 switch/case 会导致大量代码并降低可读性和可维护性,但我可以使用静态方法。使用HashTable也需要很多代码

使用静态方法:

 private static string EncodeChar(char c)
    {
        var symbols = string.Empty;

        switch (c)
        {
            case '0':
                symbols = "Test";
                break;
            case '1':
                symbols = "Hello";
                break;
            [...]
        }

        symbols;
    }

使用哈希表:

private static Hashtable table = CreateTable();

private static Hashtable CreateTable()
{
    var table = new HashTable();
    table.Add('0',"Test");
    table.Add('1', "Hello");
    [...]
    return table;
}

private static string EncodeChar(char c)
{
    return table.ContainsKey(c) ? table[c].ToString() : string.Empty;
}

编码方法:

public void Encode()
{
    string output = string.Empty;

    for (int i = 1; i < Data.Length; i++)
    {
        output = string.Concat(output, EncodeChar(Data[i]));
    }

    EncodedData = output;
}

在性能和内存分配方面有哪些优点/缺点?

【问题讨论】:

  • 是不是必须在这些方法之间进行选择?或者您可以尝试其他方法吗?
  • 也可以尝试其他方法 :-)
  • 使用Dictionary&lt;char, string&gt; 而不是HashTable——它的效率要高得多,而且更不容易出现意外的类型错误。
  • 你说得对,字典更好:-)

标签: c# hashtable switch-statement


【解决方案1】:

我会使用HashTable,因为代码更具可读性和可维护性:有一天您可以决定从 XML 文件加载替换字符串,这样您就不会更改代码来更改映射。

【讨论】:

    【解决方案2】:

    散列更快,因为您可以直接访问“编码字符串”

    例如,如果您假设所有字符都是“9”,那么每次处理一个字符时,它必须在执行正确的statement 之前计算 8 个if conditions

    这只是使用switch()时的最坏情况示例

    【讨论】:

    • Switch 语句直接跳转到正确的大小写,它们不会尝试每种情况,直到遇到正确的情况。在内部,switch 语句被有效地转换为字典,因此无论如何它都使用散列。
    • @RichK:情况比你想象的要复杂一些。有时 switch 语句会转换为字典,在某些情况下,字典可以在找到正确的元素之前尝试存储桶中的多个元素。 Switch 语句有时会编译到跳转表中,这些跳转表会直接跳转到正确的代码。 switch 语句有时会被编译成一系列有效的 if-then 语句。编译器选择哪种技术是实现细节。在这个例子中,编译器几乎肯定会选择一个跳转表。
    【解决方案3】:

    切换代码的​​作用与替代代码相同,但可读性更高,这应该是这里的主要关注点。

    然而,我会使用一个抽象工厂来为不同类型的输入获取多种不同的编码实现之一。

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多