Gibt es eine Möglichkeit, eine Zeichenfolge nach Namen und nicht nach Position in C # zu formatieren?
In Python kann ich so etwas wie dieses Beispiel machen (schamlos von hier gestohlen ):
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
Gibt es eine Möglichkeit, dies in C # zu tun? Sagen Sie zum Beispiel:
String.Format("{some_variable}: {some_other_variable}", ...);
Es wäre schön, dies mit einem Variablennamen tun zu können, aber ein Wörterbuch ist auch akzeptabel.
c#
.net-3.5
string-formatting
Jason Baker
quelle
quelle
Antworten:
Es gibt keine integrierte Methode, um dies zu handhaben.
Hier ist eine Methode
Hier ist ein anderes
Eine dritte verbesserte Methode, die teilweise auf den beiden oben genannten basiert , von Phil Haack
quelle
Ich habe eine Implementierung, die ich gerade in meinem Blog hier gepostet habe: http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx
Es werden einige Probleme behoben, die bei diesen anderen Implementierungen auftreten, wenn die Klammer ausgeblendet wird. Der Beitrag enthält Details. Es macht auch die DataBinder.Eval-Sache, ist aber immer noch sehr schnell.
quelle
Interpolierte Zeichenfolgen wurden in C # 6.0 und Visual Basic 14 hinzugefügt
Beide wurden durch den neuen Roslyn- Compiler in Visual Studio 2015 eingeführt .
C # 6.0:
return "\{someVariable} and also \{someOtherVariable}"
ODERreturn $"{someVariable} and also {someOtherVariable}"
Quelle: Was ist neu in C # 6.0?
VB 14:
return $"{someVariable} and also {someOtherVariable}"
Bemerkenswerte Funktionen (in Visual Studio 2015 IDE):
{index}
funktioniert nicht nur , sondern auch{(index + 1).ToString().Trim()}
Genießen! (& klicken Sie im VS auf "Lächeln senden")
quelle
Sie können auch anonyme Typen wie diesen verwenden:
Natürlich würde es mehr Code erfordern, wenn Sie auch die Formatierung analysieren möchten, aber Sie können eine Zeichenfolge mit dieser Funktion wie folgt formatieren:
quelle
Es scheint keine Möglichkeit zu geben, dies sofort zu tun. Es scheint jedoch machbar, eine eigene zu implementieren
IFormatProvider
, die mit einemIDictionary
for-Wert verknüpft ist .Ausgänge:
Die Einschränkung ist, dass Sie nicht mischen können
FormatProviders
, sodass die ausgefallene Textformatierung nicht gleichzeitig verwendet werden kann.quelle
Das Framework selbst bietet keine Möglichkeit, dies zu tun, aber Sie können sich diesen Beitrag von Scott Hanselman ansehen . Anwendungsbeispiel:
Dieser Code von James Newton-King ist ähnlich und funktioniert mit Untereigenschaften und Indizes.
James 'Code basiert auf System.Web.UI.DataBinder , um die Zeichenfolge zu analysieren, und erfordert die Referenzierung auf System.Web, was manche Leute in Nicht-Webanwendungen nicht gerne tun.
EDIT: Oh und sie funktionieren gut mit anonymen Typen, wenn Sie kein Objekt mit Eigenschaften dafür bereit haben:
quelle
Siehe /programming/271398?page=2#358259
Mit der verlinkten Erweiterung können Sie Folgendes schreiben:
und du wirst bekommen
"foo 2 System.Object
".quelle
Ich denke, das nächste, was Sie bekommen, ist ein indiziertes Format:
Es gibt auch String.Replace (), wenn Sie bereit sind, dies in mehreren Schritten zu tun und davon auszugehen, dass Sie Ihre 'Variablen' nirgendwo anders in der Zeichenfolge finden:
Erweitern Sie dies, um eine Liste zu verwenden:
Sie können dies auch mit einem Dictionary <string, string> tun, indem Sie die .Keys-Sammlungen iterieren. Wenn Sie jedoch eine List <KeyValuePair <string, string >> verwenden, können Sie die .ForEach () -Methode der Liste nutzen und sie wieder komprimieren ein Einzeiler:
Ein Lambda wäre noch einfacher, aber ich bin immer noch auf .Net 2.0. Beachten Sie auch, dass die Leistung von .Replace () bei iterativer Verwendung nicht herausragend ist, da Zeichenfolgen in .Net unveränderlich sind. Dazu muss die
MyString
Variable auch so definiert sein, dass sie für den Delegaten zugänglich ist, sodass sie noch nicht perfekt ist.quelle
Meine Open-Source-Bibliothek Regextra unterstützt unter anderem die benannte Formatierung. Es zielt derzeit auf .NET 4.0+ ab und ist auf NuGet verfügbar . Ich habe auch einen einführenden Blog-Beitrag darüber: Regextra : Hilft Ihnen, Ihre (Probleme) zu reduzieren {2} .
Das benannte Formatierungsbit unterstützt:
Beispiel:
Ergebnis:
Weitere Beispiele finden Sie im GitHub-Link (oben) und im Wiki des Projekts.
quelle
Überprüfen Sie dieses:
Stichprobe:
Die Leistung ist im Vergleich zu anderen Lösungen ziemlich in Ordnung.
quelle
Ich bezweifle, dass dies möglich sein wird. Das erste, was Ihnen in den Sinn kommt, ist, wie Sie Zugriff auf lokale Variablennamen erhalten.
Es könnte jedoch eine clevere Möglichkeit geben, LINQ- und Lambda-Ausdrücke zu verwenden, um dies zu tun.
quelle
Hier ist eine, die ich vor einiger Zeit gemacht habe. Es erweitert String um eine Format-Methode, die ein einzelnes Argument verwendet. Das Schöne ist, dass es die Standardzeichenfolge verwendet. Format, wenn Sie ein einfaches Argument wie ein int angeben, aber wenn Sie so etwas wie einen anonymen Typ verwenden, funktioniert es auch.
Anwendungsbeispiel:
Würde zu "Die Familie Smith hat 4 Kinder."
Es macht keine verrückten Bindungssachen wie Arrays und Indexer. Aber es ist super einfach und leistungsstark.
quelle
Beispiel:
Ausgabe: 你好, wayjet, 今天 是 2011-05-04, 这 是 你 第 18 次 登录 , 100. {100.40}
quelle
Hier ist eine einfache Methode für jedes Objekt:
Und hier, wie man es benutzt:
Ausgabe: 27.02.2012
quelle
Ich habe implementiert, dass dies eine einfache Klasse ist, die die Funktionalität von String.Format dupliziert (außer bei Verwendung von Klassen). Sie können entweder ein Wörterbuch oder einen Typ verwenden, um Felder zu definieren.
https://github.com/SergueiFedorov/NamedFormatString
C # 6.0 fügt diese Funktionalität direkt in die Sprachspezifikation ein,
NamedFormatString
um die Abwärtskompatibilität zu gewährleisten.quelle
Ich habe dies etwas anders gelöst als die vorhandenen Lösungen. Es übernimmt den Kern des Ersetzens des benannten Elements (nicht das Reflexionsbit, das einige durchgeführt haben). Es ist extrem schnell und einfach ... Dies ist meine Lösung:
Es wird folgendermaßen verwendet:
Hoffe jemand findet das nützlich!
quelle
Obwohl die akzeptierte Antwort einige gute Beispiele enthält, können sowohl das .Inject als auch einige der Haack-Beispiele nicht entkommen. Viele verlassen sich auch stark auf Regex (langsamer) oder DataBinder.Eval, das in .NET Core und in einigen anderen Umgebungen nicht verfügbar ist.
In diesem Sinne habe ich einen einfachen, auf einer Zustandsmaschine basierenden Parser geschrieben, der Zeichen durchströmt und zeichenweise in eine
StringBuilder
Ausgabe schreibt . Es wird als implementiertString
Erweiterungsmethode (n) und sowohl a annehmen kannDictionary<string, object>
oderobject
mit Parametern als Eingang (mit Reflexion).Es verarbeitet unbegrenzte Ebenen von
{{{escaping}}}
und wirft,FormatException
wenn die Eingabe unausgeglichene Klammern und / oder andere Fehler enthält.Letztendlich läuft die gesamte Logik auf 10 Hauptzustände hinaus. Wenn sich die Zustandsmaschine außerhalb einer Klammer und ebenfalls innerhalb einer Klammer befindet, ist das nächste Zeichen entweder eine offene Klammer, eine entkommene offene Klammer, eine geschlossene Klammer, eine entkommene geschlossene Klammer. oder ein gewöhnlicher Charakter. Jede dieser Bedingungen wird im Verlauf der Schleife einzeln behandelt, wobei entweder einer Ausgabe
StringBuffer
oder einer Taste Zeichen hinzugefügt werdenStringBuffer
. Wenn ein Parameter geschlossen wird, wird der Wert des SchlüsselsStringBuffer
verwendet, um den Wert des Parameters im Wörterbuch nachzuschlagen, der dann in die Ausgabe verschoben wirdStringBuffer
. Am Ende wird der Wert der AusgabeStringBuffer
zurückgegeben.quelle
Bearbeiten: Was ich hätte sagen sollen war: "Nein, ich glaube nicht, dass das, was Sie tun möchten, von C # unterstützt wird. Dies ist so nah wie möglich."
quelle
"someString" + someVariable + "someOtherString"
bessere Lesbarkeit in Betracht ziehen . Dieser Artikel stimmt mit Ihnen überein.