建议实现String.Replace(string oldValue,Func <string> newValue)函数</string>

时间:2011-10-25 09:17:10

标签: c# .net

这项任务最优雅的解决方案是什么:

有一个模板字符串,例如:"<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();
    }

你能建议更优雅的解决方案吗?

3 个答案:

答案 0 :(得分:1)

我认为是时候总结以避免错误的答案了......

最优雅的解决方案由leppieHenk 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";
    }
}