在模板中替换字符串的最快方法

时间:2009-06-06 15:33:09

标签: c# performance string

我有一些模板字符串

  

这是我的{0}模板{1}字符串

我计划将用户值放入String.Format()

字符串实际上更长,所以为了便于阅读,我使用:

  

这是我的{goodName1}模板{goodName2}字符串

然后String.Replace每个参数及其值。

如何获得最高性能和可读性?

也许我不应该在文件中使用此模板(如现在),但通过连接到字符串生成器并在需要时添加参数来动态构建它?虽然它的可读性较差。

我的其他选择是什么?

9 个答案:

答案 0 :(得分:41)

您可以将参数放在字典中,并使用Regex.Replace方法替换一个替换中的所有参数。这样,如果模板字符串变长或参数数量增加,该方法可以很好地扩展。

示例:

Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("goodName1", "asdf");
parameters.Add("goodName2", "qwerty");
string text = "this is my {goodName1} template {goodName2} string";
text = Regex.Replace(text, @"\{(.+?)\}", m => parameters[m.Groups[1].Value]);

答案 1 :(得分:16)

来自阿特伍德:It. Just. Doesn't. Matter.

答案 2 :(得分:7)

喜欢什么,取决于。如果代码每天都会被调用数百万次,那就考虑一下性能。如果它一天几次,那就去寻求可读性。

我在使用普通(不可变)字符串和StringBuilder之间做了一些基准测试。直到你在很短的时间内开始大量工作,你不需要太担心它。

答案 3 :(得分:7)

我的自发解决方案看起来像这样:

string data = "This is a {template1} that is {template2}.";

Dictionary<string, string> replacements = new Dictionary<string, string>(){
    {"{template1}", "car"},
    {"{template2}", "red"},
};

foreach (string key in replacements.Keys)
{
    data = data.Replace(key, replacements[key]);
}
Console.WriteLine(data); // outputs "This is a car that is red."

我在几个真实项目中使用过这种模板替换,但从未发现它是性能问题。由于它易于使用和理解,我没有看到任何改变它的理由。

答案 4 :(得分:3)

请注意这种想法陷入困境。 除非此代码每分钟运行数百次,并且模板文件的大小为几K,否则完成此操作更为重要。不要浪费一分钟思考这样的问题。 通常,如果您在字符串操作方面做了很多工作,那么请使用字符串构建器。 它甚至有一个Replace方法。 但是,为什么要这么麻烦。完成后,如果发现性能问题,请使用PerfMon并修复当时的REAL瓶颈。

答案 5 :(得分:2)

上面Fredrick在上面发布的内容与linq相同。

    public static string FindandReplace(this string inputText, Dictionary<string, string> placeHolderValues)
    {
        if (!string.IsNullOrEmpty(inputText))
        {
            return placeHolderValues.Keys.Aggregate(inputText, (current, key) => current.Replace(key, placeHolderValues[key]));
        }
        else return inputText;
    }

答案 6 :(得分:0)

最快的方法是使用StringBuilder使用对StringBuilder.Append()的单独调用,如下所示:

string result = new StringBuilder("this is my ")
                 .Append(UserVar1)
                 .Append(" template ")
                 .Append(UserVar2)
                 .Append(" string")
                 .ToString();

thoroughly benchmarked the framework code,而最快。如果你想提高可读性,你可以保留一个单独的字符串来显示用户,并在后台使用它。

答案 7 :(得分:0)

如果您需要一个好的,快速但简单的模板引擎,您应该查看StringTemplate。对于模板本身不需要任何逻辑或流控制的简单模板,StringTemplate是伟大的。

http://www.stringtemplate.org/download.html

答案 8 :(得分:0)

刚刚将以上答案修改为以下内容:

    string data = "This is a {template1} that is {template2}.";

    Dictionary<string, string> replacements = new Dictionary<string, string>(){
        {"{template1}", "car"},
        {"{template2}", "red"},
    };

    data.Parse(replacements);

扩展方法:

public static class Parser
{
    public static string Parse(this string template, Dictionary<string, string> replacements)
    {
        if (replacements.Count > 0)
        {
            template = replacements.Keys
                        .Aggregate(template, (current, key) => current.Replace(key, replacements[key]));
        }
        return template;
    }
}

希望这会有所帮助.. :)