用c#开发应用程序以替换字符串中的变量。
需要建议如何非常有效地做到这一点?
private string MyStrTr(string source, string frm, string to)
{
char[] input = source.ToCharArray();
bool[] replaced = new bool[input.Length];
for (int j = 0; j < input.Length; j++)
replaced[j] = false;
for (int i = 0; i < frm.Length; i++)
{
for(int j = 0; j<input.Length;j++)
if (replaced[j] == false && input[j]==frm[i])
{
input[j] = to[i];
replaced[j] = true;
}
}
return new string(input);
}
上面的代码可以正常工作,但是每个变量都需要根据变量计数在字符串中遍历。
确切要求。
parent.name = am;
parent.number = good;
I {parent.name} a {parent.number} boy.
output should be I am a good boy.
想像来源将是巨大的。
例如,如果我有5个不同的变量,则需要遍历完整字符串5次。
需要建议如何在第一次遍历时同时处理变量?
答案 0 :(得分:0)
我认为您正在遭受过早的优化。首先写最简单的东西,看看它是否适合您。如果您没有遇到性能问题,那么您就完成了。当您不知道它有多快或不是造成性能问题的原因时,不要浪费时间尝试使其更快。
顺便说一句,Facebook的服务条款(包括许多Javascript的整个HTML页面)只有164 KB。那不是特别大。
String.Replace应该可以很好地工作,即使您要替换多个字符串也是如此。也就是说,您可以编写:
string result = source.Replace("{parent.name}", "am");
result = result.Replace("{parent.number}", "good");
// more replacements here
return result;
这将使垃圾收集器稍微起作用,但是除非您拥有一个真正庞大的页面或一整堆的替换物,否则这应该不是问题。
通过将字符串转换为StringBuilder并多次调用StringBuilder.Replace,可以潜在地节省一些垃圾回收。老实说,我不知道这是否会产生明显的效果。我不知道StringBuilder.Replace
的实现方式。
有一种方法可以使速度更快,方法是编写代码来分析字符串并一次完成所有替换操作。不过,它有很多代码。您必须从多个搜索字符串构建状态机,并一次将一个字符输入source
文本。这是可行的,但是这是一项艰巨的任务,除非简单的flat方法不能足够快地起作用,否则您可能不想这样做。