字符串中的变量替换

时间:2018-10-06 14:41:30

标签: c# data-structures logic asp.net-core-2.0

用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次。

需要建议如何在第一次遍历时同时处理变量?

1 个答案:

答案 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方法不能足够快地起作用,否则您可能不想这样做。