簡體   English   中英

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

[英]fastest way to replace string in a template

我有一些模板字符串

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

我計划將用戶值放在String.Format()

字符串實際上更長,所以為了便於閱讀我使用:

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

然后String.Replace每個參數及其值。

如何獲得最高性能和可讀性?

也許我不應該在文件中使用此模板(如現在),但通過連接到字符串生成器並在需要時添加參數來動態構建它? 雖然它的可讀性較差。

我的其他選擇是什么?

您可以將參數放在字典中,並使用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]);

來自阿特伍德: 它。 只是。 不。 物。

喜歡什么,這取決於。 如果代碼每天都會被調用數百萬次,那就考慮一下性能。 如果它是一天幾次,那么為了可讀性。

我在使用普通(不可變)字符串和StringBuilder之間做了一些基准測試。 直到你在很短的時間內開始大量工作,你不必太擔心它。

我的自發解決方案看起來像這樣:

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."

我在幾個真實項目中使用過這種模板替換,但從未發現它是性能問題。 由於它易於使用和理解,我沒有看到任何改變它的理由。

請注意這種想法陷入困境。 除非此代碼每分鍾運行數百次,並且模板文件的大小為幾K,否則完成此操作更為重要。 不要浪費一分鍾思考這樣的問題。 通常,如果您在字符串操作方面做了很多工作,那么請使用字符串構建器。 它甚至有一個Replace方法。 但是,為什么要這么麻煩。 完成后,如果發現性能問題,請使用PerfMon並修復當時的REAL瓶頸。

與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;
    }

剛剛將以上答案修改為以下內容:

    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;
    }
}

希望這可以幫助.. :)

最快的方法是使用StringBuilder,使用對StringBuilder.Append()單獨調用,如下所示:

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

我已經對框架代碼進行了徹底的基准測試 ,這是最快的。 如果您想提高可讀性,可以保留一個單獨的字符串來顯示用戶,並在后台使用它。

如果你需要一個好的,快速但簡單的模板引擎,你應該檢查StringTemplate。 對於模板本身不需要任何邏輯或流控制的簡單模板,StringTemplate是GREAT。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM