10 Stimmen

String hat wie viele Parameter

Bevor ich String.Format verwende, um eine Zeichenkette in C# zu formatieren, würde ich gerne wissen, wie viele Parameter diese Zeichenkette akzeptiert?

Wenn z. B. die Zeichenfolge "{0} ist nicht dasselbe wie {1}" lautet, möchte ich wissen, dass diese Zeichenfolge zwei Parameter akzeptiert Wenn die Zeichenfolge z. B. "{0} ist nicht dasselbe wie {1} und {2}" lautet, akzeptiert die Zeichenfolge 3 Parameter

Wie kann ich diese effizient finden?

8voto

Rubens Farias Punkte 55555

String.Format erhält ein String-Argument mit format Wert, und ein params object[] Array, das mit beliebig großen Werten umgehen kann.

Für jeden object Wert, ist es .ToString() Methode wird aufgerufen, um dieses Formatmuster aufzulösen

EDIT : Ich habe Ihre Frage anscheinend falsch verstanden. Wenn Sie wissen wollen, wie viele Argumente für Ihr Format erforderlich sind, können Sie das mit einem regulären Ausdruck herausfinden:

string pattern = "{0} {1:00} {{2}}, Failure: {0}{{{1}}}, Failure: {0} ({0})";
int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets
    @"\{\d+(?:\:?[^}]*)\}").Count; // returns 6

Als Benjamin in den Kommentaren erwähnt, müssen Sie vielleicht die Anzahl der verschiedene Referenzen. Wenn Sie nicht mit Linq arbeiten, hier ist es:

int count = Regex.Matches(Regex.Replace(pattern, 
    @"(\{{2}|\}{2})", ""), // removes escaped curly brackets
    @"\{(\d+)(?:\:?[^}]*)\}").OfType<Match>()
    .SelectMany(match => match.Groups.OfType<Group>().Skip(1))
    .Select(index => Int32.Parse(index.Value))
    .Max() + 1; // returns 2

Dies gilt auch für @ 280Z28 letztes Problem erkannt.

Edit by 280Z28: Die Eingabe wird nicht validiert, aber für jede gültige Eingabe wird die richtige Antwort gegeben:

int count2 =
    Regex.Matches(
        pattern.Replace("{{", string.Empty),
        @"\{(\d+)")
    .OfType<Match>()
    .Select(match => int.Parse(match.Groups[1].Value))
    .Union(Enumerable.Repeat(-1, 1))
    .Max() + 1;

1voto

Justin Niessner Punkte 235353

Sie müssen die Zeichenkette parsen und den höchsten ganzzahligen Wert zwischen den {} Dann fügen Sie eine hinzu.

...oder zählen Sie die Anzahl der Sätze von {} 's.

Wie auch immer, es ist hässlich. Mich würde interessieren, warum Sie in der Lage sein müssen, diese Zahl programmatisch zu ermitteln.

EDIT

Wie 280Z28 bereits erwähnt hat, müssen Sie die verschiedenen Eigenheiten dessen berücksichtigen, was zwischen dem {} 's (mehrere {} Formatierungszeichenfolgen, usw.).

1voto

Lex Li Punkte 56075

Ich verlasse mich auf ReSharper, um das für mich zu analysieren, und es ist schade, dass Visual Studio nicht mit einer so tollen Funktion ausgestattet ist.

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