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