1

我有两个需要映射的数组。在代码中

var result = "[placeholder2] Hello my name is [placeholder1]";
var placeholder = { "[placeholder1]", "[placeholder2]", "[placeholder3]", "[placeholder4]" };
var placeholderValue = { "placeholderValue3", "placeholderValue2", "placeholderValue3" };

Array.ForEach(placeholder , i => result = result.Replace(i, placeholderValue));

给定iplaceholderValue需要以智能方式设置。我可以实现一个 switch 语句。对于 30 个左右的元素,圈复杂度将是不可接受的。什么是好的模式、扩展方法或其他方式来实现我的目标?

4

3 回答 3

2

为了简单起见,我跳过了空检查

string result = "[placeholder2] Hello my name is [placeholder1]";
var placeHolders = new Dictionary<string, string>() { 
    { "placeholder1", "placeholderValue1" }, 
    { "placeholder2", "placeholderValue2" } 
};

var newResult =  Regex.Replace(result,@"\[(.+?)\]",m=>placeHolders[m.Groups[1].Value]);
于 2012-04-20T17:44:27.987 回答
0

最小的代码更改是仅使用 for 循环,而不是 ForEach,或者在您的情况下,是使用 lambda 的 ForEach。使用 for 循环,您将获得placehoderValue数组中适当值的索引。

下一个改进是制作一个对象的单个数组,该数组同时包含占位符和它的值,而不是需要保持同步的两个“并行”数组。

比这更好,也更容易实现的是,只需将 aDictionary键作为占位符,将值作为占位符值。这实质上是通过使用 KeyValuePair 类为您完成上述建议(因此您不需要自己制作)。

此时伪代码变为:

foreach(key in placeholderDictionary) replace key with placeholderDictionary[key]

于 2012-04-20T17:38:10.703 回答
0

我认为您想使用Zip将占位符与其值结合起来。

var result = "[placeholder2] Hello my name is [placeholder1]";
var placeholder = new[] { "[placeholder1]", "[placeholder2]", "[placeholder3]", "[placeholder4]" };
var placeholderValue = new[] { "placeholderValue1", "placeholderValue2", "placeholderValue3", "placeholderValue4" };
var placeHolderPairs = placeholder.Zip(placeholderValue, Tuple.Create);

foreach (var pair in placeHolderPairs)
{
    result = result.Replace(pair.Item1, pair.Item2);
}
于 2012-04-20T17:41:25.137 回答