用c#中列表中的连续元素替换字符串占位符

Replace a string placeholder with consecutive elements from a list in c#

我知道有人问过类似的问题,但我找不到任何特别适合我需要的东西,而且我对正则表达式一无所知。

我有像这样的不同长度的句子:

在开发配方时提供 +$modifier% 的最大质量奖励和 +$modifier% 的特殊特性几率。

所以 $modifier 是我所有的占位符。我有一个花车列表,然后我将根据订单相应地替换它。

在这种情况下,我有一个列表值 {5,0.5}。替换后的字符串应以

结尾

在开发配方时提供 +5% 的最大质量加成和 +0.5% 的特殊特性几率。

我想避免 string.Replace 因为文本可能会变长,我不想在上面循环多次。谁能建议一个好的方法来做到这一点?

欢呼和感谢 H

由于字符串在 CLR 中是不可变的,因此可能没有明智的方法来拆分字符串并将其以某种方式重新组合在一起。

一种方法是在您想要的标记字符串处拆分,插入您的替换值,然后再次连接您的部分:

var s = "Provides a +$modifier % bonus to Maximum Quality and a +$modifier % chance for Special Traits when developing a Recipe.";
var v = new List<float> { 5.0f, 0.5f };

var result = string.Concat(s.Split("$modifier").Select((s, i) => $"{s}{(i < v.Count ? v[i] : string.Empty)}"));

方法 Regex.Replace 有一个重载,您可以在其中指定一个回调方法来提供用于每个替换的值。

private string ReplaceWithList(string source, string placeHolder, IEnumerable<object> list)
{
    // Escape placeholder so that it is a valid regular expression
    placeHolder = Regex.Escape(placeHolder);

    // Get enumerator for list
    var enumerator = list.GetEnumerator();

    // Use Regex engine to replace all occurences of placeholder
    // with next entry from enumerator
    string result = Regex.Replace(source, placeHolder, (m) => 
    {
        enumerator.MoveNext();
        return enumerator.Current?.ToString();
    });

    return result;
}

这样使用:

string s = "Provides a +$modifier% bonus to Maximum Quality and a +$modifier% chance for Special Traits when developing a Recipe.";
List<object> list = new List<object> { 5, 0.5 };

s = ReplaceWithList(s, "$modifier", list);

请注意,您需要添加合理的错误处理。