Laden...

Replace viele Textstellen

Erstellt von pingelich vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.594 Views
P
pingelich Themenstarter:in
3 Beiträge seit 2015
vor 9 Jahren
Replace viele Textstellen

Hallo zusammen,

ich bin derzeit dabei C# zu lernen und verbinde es gleich mit ein paar Projekten, die ich damit umsetzen möchte.
Dieses Projekt verschickt per SMTP HTML E-Mails. Die Daten dazu werden, wenn alles funktioniert, aus der Datenbank selektiert.

Meine Idee ist es nun, dass ich eine Art Template nehme, da bei bestimmten Fällen ein Textblock hinzugefügt wird. Die HTML-Vorlage liegt irgendwo im Filesystem rum, dieses lese ich mir in eine Variable. An die Stellen, an denen z.B. der Vorname stehen soll, setze ich Platzhalter ein. Im Script ersetze ich diese entsprechend.

Da es aber viele viele viele Platzhalter werden und mir meine Lösung (sie funktioniert 😃) unten nicht so ganz gefällt, würde ich gerne mal wissen wie man es besser gestallten könnte.

Freue mich auf Antwort und Tipps 😃

Gruß
Marco


                string htmlMessageBody= System.IO.File.ReadAllText(@"c:\projekt\inc_Main.html"
                    , Encoding.Default);

                string Adressaenderung = System.IO.File.ReadAllText(@"c:\projekt\inc_7_Adressaenderung.html"
                    , Encoding.Default);

                Aenderung= Aenderung.Replace("::var_anrede::", "var_anrede!!!!!!!!");
                Aenderung= Aenderung.Replace("::var_vn::", "var_vn!!!!!!!!");
                Aenderung= Aenderung.Replace("::var_nn::", "var_nn!!!!!!!!");
                Aenderung= Aenderung.Replace("::var_STR::", "var_STR!!!!!!!!");
                Aenderung= Aenderung.Replace("::var_PLZ::", "var_PLZ!!!!!!!!");
                Aenderung= Aenderung.Replace("::var_ORT::", "var_ORT!!!!!!!!");
                Aenderung= Aenderung.Replace("::var_tel::", "var_tel!!!!!!!!");

                htmlMessageBody = htmlMessageBody.Replace("::var_Aenderung::", Aenderung);
16.830 Beiträge seit 2008
vor 9 Jahren

Ich empfehl Dir die https://github.com/Antaris/RazorEngine dafür zu nutzen.
Kannst Du wie gewohnt die Razor-Templates für das Verarbeiten von Templates für E-Mails auch ohne ASP.NET MVC Kern verwenden.
Verwenden hier im Forum einige - ich auch.

P
pingelich Themenstarter:in
3 Beiträge seit 2015
vor 9 Jahren

Hallo,

danke für Deine Antwort. Das werde ich mir mal ansehen. Schaut interessant aus 😃

Nichts desto trotz würde mich es interessieren wie man es anders gestallten könnte, auf der Grundlage wie ich es nun habe.

Gruß
Marco

4.938 Beiträge seit 2008
vor 9 Jahren

Hallo,

du solltest die Daten in einer Datenstruktur halten und dann nur eine (einfache) Methode für die Änderung der Platzhalter schreiben:


Dictionary<string, string> vars = new Dictionary<string, string>()
{
  { "::var_anrede::", "var_anrede!!!!!!!!" },
  { "::var_vn::", "var_vn!!!!!!!!" },
  // ...
}

string ReplaceVars(string text)
{
   foreach (string var in vars)
      // todo: ...
}

Und selbst wenn die Variablen erst zur Laufzeit des Programms vorliegen, so solltest du diese zur Datenstruktur hinzufügen und danach dann die ReplaceVars()-Methode aufrufen:


vars.Add("::var_anrede::", textBoxAnrede.Text);

C
2.121 Beiträge seit 2010
vor 9 Jahren

Der String muss jedes mal neu nach dem zu ersetzenden Teil durchsucht werden. Ist es das was dich stört?

Schneller würds schon auch gehen, wobei da viel dran hängt wie du das angehst!
Zum Beispiel wenn du dir die einzelnen Teile des Strings einmalig (am Programmstart) heraus suchst und dann das Ergebnis aus diesen Teilen zusammenbaust. Dann aber mit einem StringBuilder um nicht wieder mehrere Kopiervorgänge von Strings zu erzeugen.
Reihenfolge der Variablen beachten, die muss nicht immer die selbe sein.

Da wirds dann aber wirklich schnell aufwendig zu programmieren. Da wäre eine Zeitmessung zwischen den verschiedenen Methoden angesagt.
Deine bisherige Lösung ist übersichtlich. Überschaubarer geht es kaum. Wär schade wenn du dir viel Arbeit machst und Code produzierst den du um einiges komplizierter verstehst als den jetzigen - und keinen spürbaren zeitlichen Vorteil hast.

P
pingelich Themenstarter:in
3 Beiträge seit 2015
vor 9 Jahren

Hallo,

vielen Dank für euer Antwort 😃

Ja, mich stören ehrlich gesagt die ganzen Replace-Zeilen. Wenn ich das nun so aufbaue, wäre das korrekt?


            Dictionary<string, string> Dictionary = new Dictionary<string, string>()
            {
                {"::var_Anrede::", "Herr"},
                {"::var_Vorname::", "Marco"},

            };

            foreach (KeyValuePair<string, string> Vars in Dictionary)
            {
                htmlMessageBody = htmlMessageBody.Replace(Vars.Key, Vars.Value);
            }