我遇到的具体问题是我必须用等效的 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/