在没有开关的情况下映射两个字符串数组

本文关键字:两个 数组 字符串 映射 开关 情况下 | 更新日期: 2023-09-27 18:31:52

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

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需要以智能的方式设置。 我可以实现一个开关语句。 对于30个左右的元素,其圈复杂性是不可接受的。 什么是实现目标的良好模式、扩展方法或其他手段?

在没有开关的情况下映射两个字符串数组

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

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]);

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

下一个改进是创建一个包含占位符及其值的对象数组,而不是两个需要保持同步的"并行"数组。

比这更好,也更容易实现,就是只有一个Dictionary键是占位符,值是占位符值。 这基本上通过使用 KeyValuePair 类为您执行上述建议(因此您无需创建自己的类)。

此时,伪代码变为:

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

我认为您想使用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);
}