Wie man ein Ersetzen ohne Berücksichtigung der Groß- und Kleinschreibung mit einem StringBuilder durchführt

Ich habe eine (große) Vorlage und möchte mehrere Werte ersetzen. Der Austausch muss ohne Berücksichtigung der Groß- und Kleinschreibung erfolgen. Es müssen auch Schlüssel vorhanden sein, die in der Vorlage nicht vorhanden sind.

Beispielsweise

[TestMethod]
public void ReplaceMultipleWithIgnoreCaseText()
{
    const string template = "My name is @Name@ and I like to read about @SUBJECT@ on @website@, tag  @subject@";  
    const string expected = "My name is Alex and I like to read about C# on stackoverflow.com, tag C#";
    var replaceParameters = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("@name@","Alex"),
        new KeyValuePair<string, string>("@subject@","C#"),
        new KeyValuePair<string, string>("@website@","stackoverflow.com"),
        // Note: The next key does not exist in template 
        new KeyValuePair<string, string>("@country@","The Netherlands"), 
    };
    var actual = ReplaceMultiple(template, replaceParameters);
    Assert.AreEqual(expected, actual);
}

public string ReplaceMultiple(
                  string template, 
                  IEnumerable<KeyValuePair<string, string>> replaceParameters)
{
    throw new NotImplementedException(
                  "Implementation needed for many parameters and long text.");
}

Beachten Sie, dass ich keine 30 großen Zeichenfolgen im Speicher haben möchte, wenn ich eine Liste mit 30 Parametern und eine große Vorlage habe. Die Verwendung eines StringBuilders scheint eine Option zu sein, aber auch andere Lösungen sind willkommen.

Lösung Ich habe versucht, aber nicht funktioniert

Lösung hier gefunden C # String durch Wörterbuch ersetzen) löst eine Ausnahme aus, wenn ein Schlüssel nicht in der Sammlung enthalten ist, unsere Benutzer jedoch Fehler machen. In diesem Fall möchte ich den Schreibschlüssel einfach im Text belassen. Beispiel

static readonly Regex re = new Regex(@"\$(\w+)\$", RegexOptions.Compiled);
static void Main2()
{
    // "Name" is accidentally typed by a user as "nam". 
    string input = @"Dear $nam$, as of $date$ your balance is $amount$"; 

    var args = new Dictionary<string, string>(
        StringComparer.OrdinalIgnoreCase) {
    {"name", "Mr Smith"},
    {"date", "05 Aug 2009"},
    {"amount", "GBP200"}};


    // Works, but not case insensitive and 
    // uses a lot of memory when using a large template
    // ReplaceWithDictionary many args
    string output1 = input;
    foreach (var arg in args)
    {
        output1 = output1.Replace("$" + arg.Key +"$", arg.Value);
    }

    // Throws a KeyNotFoundException + Only works when data is tokenized
    string output2 = re.Replace(input, match => args[match.Groups[1].Value]);
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage