3 Stimmen

Template-Engine-Implementierung

Ich baue gerade diese kleine Template-Engine. Es nimmt eine Zeichenfolge, die die Vorlage in Parameter enthält, und ein Wörterbuch von "Tags, Werte" in der Vorlage zu füllen.

In der Engine habe ich keine Ahnung, welche Tags in der Vorlage enthalten sein werden und welche nicht.

Ich bin gerade dabei, das Wörterbuch zu durchlaufen (foreach), meine Zeichenfolge zu analysieren, die ich in einen String Builder eingegeben habe, und die Tags in der Vorlage durch den entsprechenden Wert zu ersetzen.

Gibt es einen effizienteren/bequemeren Weg, dies zu tun? Ich weiß, dass der größte Nachteil hier ist, dass der Stringbuilder jedes Mal vollständig für jedes Tag geparst wird, was ziemlich schlecht ist...

(Ich überprüfe auch, obwohl nicht im Beispiel enthalten, nach dem Prozess, dass meine Vorlage kein Tag mehr enthält. Sie sind alle auf dieselbe Weise formatiert: @@tag@@)

//Dictionary<string, string> tagsValueCorrespondence;
//string template;

StringBuilder outputBuilder = new StringBuilder(template);
foreach (string tag in tagsValueCorrespondence.Keys)
{
    outputBuilder.Replace(tag, tagsValueCorrespondence[tag]);
}

template = outputBuilder.ToString();

Antworten:

@Marc:

string template = "Some @@foobar@@ text in a @@bar@@ template";
StringDictionary data = new StringDictionary();
data.Add("foo", "value1");
data.Add("bar", "value2");
data.Add("foo2bar", "value3");

Ausgabe: "Ein Text in einer value2-Vorlage"

anstelle von: "Einige @@foobar@@ Texte in einer value2 Vorlage"

1voto

Marc Gravell Punkte 970173

Wie wäre es mit einem Regex und MatchEvaluator? Etwa so:

string template = "Some @@Foo@@ text in a @@Bar@@ template";
StringDictionary data = new StringDictionary();
data.Add("foo", "random");
data.Add("bar", "regex");
string result = Regex.Replace(template, @"@@([^@]+)@@", delegate(Match match)
{
    string key = match.Groups[1].Value;
    return data[key];
});

0voto

Lloyd Punkte 1304

Hier ist ein Beispielcode, den Sie als Ausgangspunkt verwenden können:

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

class Program {
    static void Main() {
        var template = " @@3@@  @@2@@ @@__@@ @@Test ZZ@@";
        var replacement = new Dictionary<string, string> {
                {"1", "Value 1"},
                {"2", "Value 2"},
                {"Test ZZ", "Value 3"},
            };
        var r = new Regex("@@(?<name>.+?)@@");
        var result = r.Replace(template, m => {
            var key = m.Groups["name"].Value;
            string val;
            if (replacement.TryGetValue(key, out val))
                return val;
            else
                return m.Value;
        });
        Console.WriteLine(result);
    }
}

0voto

Sie könnten die mono-Stringformat-Implementierung so ändern, dass sie Ihr stringdictionary akzeptiert. Zum Beispiel http://github.com/wallymathieu/cscommon/blob/master/library/StringUtils.cs

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X