我有一些模板字符串
这是我的{0}模板{1}字符串
我计划将用户值放入String.Format()
。
字符串实际上更长,所以为了便于阅读,我使用:
这是我的{goodName1}模板{goodName2}字符串
然后String.Replace
每个参数及其值。
如何获得最高性能和可读性?
也许我不应该在文件中使用此模板(如现在),但通过连接到字符串生成器并在需要时添加参数来动态构建它?虽然它的可读性较差。
我的其他选择是什么?
答案 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是伟大的。
答案 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;
}
}
希望这会有所帮助.. :)