Home > OS >  Replace a single placeholder with consecutive elements from a list in c#
Replace a single placeholder with consecutive elements from a list in c#

Time:10-18

i know similar questions have been asked, but I couldn't find anything specifically fitting my need and I am supremely ignorant about Regex.

I have sentences of varying length like this one:

Provides a $modifier% bonus to Maximum Quality and a $modifier% chance for Special Traits when developing a Recipe.

so that $modifier is my placeholder for all of them. I have a list of floats that I will then replace accordingly to the order.

In this case I have a List values {5,0.5}. The replaced string should end up as

Provides a 5% bonus to Maximum Quality and a 0.5% chance for Special Traits when developing a Recipe.

I would like to avoid string.Replace as texts might get longer and i wouldn't like to loop multiple time over it. Could anyone suggest a good approach to do it?

Cheers and thanks H

CodePudding user response:

As strings are immutable in the CLR there's probably no sensible way around splitting your string and putting it back together in some way.

One would be to split at your desired marker string, insert your replacement values and afterwards concatenate your parts again:

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)}"));

CodePudding user response:

The method Regex.Replace has an overload where you can specify a callback method to provide the value to use for each replacement.

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;
}

Use like that:

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

Note that you need to add sensible error handling.

  • Related