这项任务最优雅的解决方案是什么:
有一个模板字符串,例如:"<CustomAction Id=<newGuid> /><CustomAction Id=<newGuid> />"
我需要用不同的Guid替换<newGuid>
。
概括问题:
.Net字符串类具有带有2个参数的Replace方法:char或字符串类型的oldValue和newValue。问题是newValue是静态字符串(不是返回字符串的函数)。
我有一个简单的实现:
public static string Replace(this string str, string oldValue, Func<String> newValueFunc)
{
var arr = str.Split(new[] { oldValue }, StringSplitOptions.RemoveEmptyEntries);
var expectedSize = str.Length - (20 - oldValue.Length)*(arr.Length - 1);
var sb = new StringBuilder(expectedSize > 0 ? expectedSize : 1);
for (var i = 0; i < arr.Length; i++)
{
if (i != 0)
sb.Append(newValueFunc());
sb.Append(arr[i]);
}
return sb.ToString();
}
你能建议更优雅的解决方案吗?
答案 0 :(得分:1)
我认为是时候总结以避免错误的答案了......
最优雅的解决方案由leppie和Henk Holterman建议:
public static string Replace(this string str, string oldValue, Func<string> newValueFunc)
{
return Regex.Replace( str,
Regex.Escape(oldValue),
match => newValueFunc() );
}
答案 1 :(得分:0)
这对我有用:
public static string Replace(this string str, string oldValue,
Func<String> newValueFunc)
{
var arr = str.Split(new[] { oldValue }, StringSplitOptions.None);
var head = arr.Take(1);
var tail =
from t1 in arr.Skip(1)
from t2 in new [] { newValueFunc(), t1 }
select t2;
return String.Join("", head.Concat(tail));
}
如果我从这开始:
int count = 0;
Func<string> f = () => (count++).ToString();
Console.WriteLine("apple pie is slappingly perfect!".Replace("p", f));
然后我得到了这个结果:
a01le 2ie is sla34ingly 5erfect!
答案 2 :(得分:0)
使用
Regex.Replace(String,MatchEvaluator)
using System;
using System.Text.RegularExpressions;
class Sample {
// delegate string MatchEvaluator (Match match);
static public void Main(){
string str = "<CustomAction Id=<newGuid> /><CustomAction Id=<newGuid> />";
MatchEvaluator myEvaluator = new MatchEvaluator(m => newValueFunc());
Regex regex = new Regex("newGuid");//OldValue
string newStr = regex.Replace(str, myEvaluator);
Console.WriteLine(newStr);
}
public static string newValueFunc(){
return "NewGuid";
}
}