Ich möchte in einer guten Leistung Weise (ich hoffe) einen benannten Parameter in meiner Zeichenfolge zu einem benannten Parameter aus Code ersetzen, Beispiel, meine Zeichenfolge:
%Vor%Wie kann ich {name} durch den Code Reguläre Ausdrücke ersetzen? Zu teuer? Welchen Weg empfehlen Sie?
Wie ersetzen sie im Beispiel NHibernates HQL: my_param zu dem benutzerdefinierten Wert? Oder in ASP.NET (MVC) Routing, das mir besser gefällt, "{controller} / {action}", new {controller="Hallo", ...}?
Haben Sie bestätigt, dass reguläre Ausdrücke zu teuer sind?
Die Kosten für reguläre Ausdrücke sind stark übertrieben. Für solch ein einfaches Muster wird die Leistung ziemlich gut sein, wahrscheinlich nur etwas weniger gut als das direkte Suchen und Ersetzen in der Tat. Haben Sie auch mit dem Flag Compiled
experimentiert, wenn Sie den regulären Ausdruck erstellen?
Wie gesagt, können Sie nicht einfach die einfachste Methode verwenden, also Replace
?
Regex ist sicherlich eine praktikable Option, vor allem mit einem MatchEvaluator
:
Wenn Sie jetzt Ersatz in einem Wörterbuch haben, wie folgt:
%Vor%dann wird die Regex ziemlich einfach:
%Vor%Nachdem ich darüber nachgedacht hatte, wurde mir klar, was ich mir eigentlich wünschte. String.Format () würde ein IDictionary als Argument nehmen, und dass Templates mit Namen statt mit Indizes geschrieben werden könnten.
Bei String-Ersetzungen mit vielen möglichen Schlüsseln / Werten führen die Indexnummern zu unleserlichen String-Templates - und in einigen Fällen wissen Sie vielleicht nicht einmal, welche Artikel welche Nummer haben werden. Daher habe ich die folgende Erweiterung entwickelt :
Im Grunde genommen können Sie String-Vorlagen mit Namen anstelle von Zahlen und einem Wörterbuch anstelle eines Arrays verwenden. Außerdem können Sie alle anderen guten Funktionen von String.Format () verwenden, sodass bei Bedarf ein benutzerdefinierter IFormatProvider verwendet werden kann und erlaubt die Verwendung aller üblichen Formatierungssyntax - Genauigkeit, Länge usw.
Das Beispiel , das im Referenzmaterial für String.Format enthalten ist, ist ein gutes Beispiel dafür Vorlagen mit vielen nummerierten Elementen werden vollständig unleserlich - wenn Sie dieses Beispiel für die Verwendung dieser neuen Erweiterungsmethode portieren, erhalten Sie etwa Folgendes:
%Vor%Wenn jemand darauf hingewiesen hat, dass das, was Sie schreiben, sehr optimiert sein muss, verwenden Sie nicht so etwas - wenn Sie Millionen von Strings auf diese Weise in einer Schleife formatieren müssen, könnte der Speicher- und Leistungsaufwand höher sein signifikant.
Wenn Sie andererseits daran interessiert sind, lesbaren, wartbaren Code zu schreiben - und wenn Sie zum Beispiel eine Reihe von Datenbankoperationen durchführen, wird diese Funktion im großen Rahmen der Dinge keinen signifikanten Overhead hinzufügen .
...
Aus praktischen Gründen habe ich versucht, eine Methode hinzuzufügen, die ein anonymes Objekt anstelle eines Wörterbuchs akzeptiert:
%Vor% Aus irgendeinem Grund funktioniert das nicht - die Übergabe eines anonymen Objekts wie new { name: "value" }
an diese Erweiterungsmethode ergibt eine Kompilierungsfehlermeldung, die besagt, dass die IDictionary-Version der Methode die beste Übereinstimmung ist. Nicht sicher, wie das zu beheben ist. (jemand?)
Eine kompilierte Regex könnte den Trick machen, besonders wenn es viele zu ersetzende Token gibt. Wenn es nur eine Handvoll von ihnen gibt und die Leistung der Schlüssel ist, würde ich das Token einfach nach Index finden und durch Zeichenfolgenfunktionen ersetzen. Glauben Sie es oder nicht, das wird schneller als eine Regex sein.
Versuchen Sie es mit StringTemplate. Es ist viel mächtiger als das, aber es macht den Job einwandfrei.
oder versuchen Sie dies mit Linq, wenn Sie alle Ihre Ersetzungswerte in einem Dictionary-Objekt gespeichert haben.
Zum Beispiel:
%Vor%dict ist Ihr Such-Ersetzung-Paar definiertes Dictionary-Objekt. str ist Ihre Zeichenfolge, mit der Sie einige Ersetzungen vornehmen müssen.
Ich würde für die mindplay.dk Lösung gehen ... Funktioniert ganz gut.
Und, mit einer leichten Änderung, unterstützt es Schablonenvorlagen, wie "Hallo {Name}, magst du {0}?", Ersetze {Name}, behalte aber {0}:
Ersetzen Sie in der angegebenen Quelle ( Ссылка ) wie folgt:
%Vor%Außerdem unterstützt es eine Länge ({name, 30}) sowie einen formatspezifikator oder eine Kombination aus beidem.
Tags und Links string c# regex performance named-parameters