c# - 将一个数组中的字符串中的字符高效替换为另一个数组

标签 c# algorithm unicode

我遇到的具体问题是我必须用等效的 Unicode 下标替换化学式中的数字,因此 H2SO4 => H2SO4。 (那些下标不是字体调整,它们是特殊的unicode字符。)

所以我最初的剪辑是:

return unit.Replace("2", "₂").
            Replace("3", "₃").
            Replace("4", "₄").
            Replace("5", "₅").
            Replace("6", "₆").
            Replace("7", "₇");

这行得通,但显然不是特别有效。对更优化的算法有什么建议吗?

最佳答案

只有 10 个可能的下标字符需要替换,而且大多数化学式都不会太长。出于这个原因,我认为您的实现并不是非常低效,我建议在尝试优化代码之前对您的代码进行基准测试。

但这是我尝试创建一种方法来满足您的需要:

    public string ToSubscriptFormula(string input)
    {
        var characters = input.ToCharArray();
        for (var i = 0; i < characters.Length; i++)
        {
            switch (characters[i])
            {
                case '2':
                    characters[i] = '₂';
                    break;
                case '3':
                    characters[i] = '₃';
                    break;
               // case statements omitted
            }
        }
        return new string(characters);
    }

我建议避免使用 StringBuilder除非您要附加大量字符串,否则创建实例的开销实际上会降低您的代码效率。参见 this post by Jon Skeet有关何时使用它的详细说明。

此外,考虑到 case 语句的数量有限,我个人不认为使用 Dictionary<char,char>会增加任何可读性或性能优势,但在不同的情况下,考虑使用一个可能会有用。

但如果您真的必须 super 优化您的方法,您可以用以下代码替换 case 语句(感谢 andrew 的建议):

public string ToSubscriptFormula(string input)
{
    var characters = input.ToCharArray();
    const int distance = '₀' - '0';    // distance of subscript from digit
    for (var i = 0; i < characters.Length; i++)
    {
        if(char.IsDigit(characters[i]))
        {
            characters[i] = (char) (characters[i] + distance);
        }
    }
    return new string(characters);
}

这里的诀窍是所有下标字符都是连续的,并且转换为 int。至 char会给你相应的字符。

最后,正如@nwellnhof 在评论中所建议的那样,char.IsDigit()对于 Unicode Nd Category 中的一些非拉丁数字字符将返回 true . 如果您的化学式包含此类字符,则该语句应替换为 c >= '0' && c<='9' .这可能会比 char.IsDigit 稍微快一点但我不确定它是否会在大多数实际情况下产生影响。

关于c# - 将一个数组中的字符串中的字符高效替换为另一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36487915/

相关文章:

c# - HtmlAgilityPack - 删除集合中的所有节点

python - Python 中非 ASCII 字符的 chr

firefox - 为什么firefox没有utf-8编码?

PHP:使用 PDO 从 MySQL 数据库输出 utf8 时出现问题

c# - 创建用于基于策略的授权期间拒绝访问的自定义页面

c# - "00000000000000000000000000000"匹配正则表达式 "^[1-9]|0$"

c# - 拆分这些字符串而不破坏拆分参数?

java - 相等元素在插入排序算法中是否保留它们的顺序?

algorithm - 英国旅游者

algorithm - 查找子字符串,带有一些附加条件