我是一个独特的问题..!
我有一个字符串,在多个位置上都有一些常量值。例如,考虑以下字符串。
string tmpStr = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?"
现在我想用存储在数组中的值替换字符串中的每个tmp,第一个tmp保存array[0],第二个tmp保存array[1],以此类推... 有什么好的方法吗? 我使用的是C#2.0。
string input = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#...?";
string[] array = { "value1", "value2", "value3" };
Regex rx = new Regex(@"\b_tmp_\b");
if (rx.Matches(input).Count <= array.Length)
{
int index = 0;
string result = rx.Replace(input, m => array[index++]);
Console.WriteLine(result);
}
您需要确保找到的匹配数永远不会大于数组的长度,如上所示。
编辑:针对评论,可以通过将lambda替换为以下内容轻松使用C# 2.0:
string result = rx.Replace(input, delegate(Match m) { return array[index++]; });
http://msdn.microsoft.com/en-us/library/aa332127%28VS.71%29.aspx
string[] myarray = new string[] { 'val1', 'val2' };
string s = "Hello _tmp_ how is _tmp_ this possible _tmp_ in C#";
string[] items = s.Split("tmp");
for (int i = 0; i < items.Length; i++)
{
Console.WriteLine(parts[i] + myarray[i] ) ;
}
我认为Ahmad Mageed的第一个解决方案是最好的,因为当传递到rx.Replace方法中时,array[index++]只会被评估一次。
我也编译了它来验证我是否正确理解了它,结果它产生了以下输出:
你好 value1 这怎么可能在C#中出现value1...
随着框架的后续版本,行为是否发生了变化?或者我认为预期的输出应该是:
你好 value1 这怎么可能在C#中出现value2...?
array[index++]
,框架的行为不会改变,就像我在回滚之前所做的那样。这确实会一遍又一遍地给出value1。第二种方法有效的原因是index
变量被委托捕获了。有关更多信息,请参见Jon Skeet的有关闭包的文章:http://csharpindepth.com/Articles/Chapter5/Closures.aspx - Ahmad Mageed
MatchEvaluator
的位置。每个找到的匹配项都将被数组的一个元素替换。因此,第一个匹配项将被替换为array [0],然后index ++
将把index
设置为1,然后下一个匹配项将被推进到array [1]的值,依此类推。 - Ahmad Mageedarray[index ++]
,那么它将被评估一次并重复使用value1
,与问题的目标相反。您可能需要参考Jon Skeet关于闭包的文章以获取更多详细信息:http://csharpindepth.com/Articles/Chapter5/Closures.aspx - Ahmad Mageed