1

マップする必要のある2つの配列があります。コード内

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

簡単にするためにnullチェックをスキップしました

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

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 に答える
0

最小のコード変更は、ForEachではなく、forループを使用することです。この場合、ForEachはラムダを使用します。forループを使用すると、placehoderValue配列に適切な値のインデックスが作成されます。

次の改善点は、同期を維持する必要がある2つの「並列」配列ではなく、プレースホルダーとその値の両方を保持するオブジェクトの単一配列を作成することです。

それよりもさらに優れており、実装もさらに簡単なのはDictionary、キーがプレースホルダーであり、値がプレースホルダー値であるということです。これは基本的に、KeyValuePairクラスを使用して上記の提案を行います(したがって、独自に作成する必要はありません)。

その時点で、擬似コードは次のようになります。

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

于 2012-04-20T17:38:10.703 に答える