2010-01-28 5 views
9

Bevor Sie String.Format verwenden, um eine Zeichenfolge in C# zu formatieren, möchte ich wissen, wie viele Parameter diese Zeichenfolge akzeptiert?String hat wie viele Parameter

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

Wie kann ich das effizient finden?

+0

Dies ist nicht einfach. Was versuchst du zu erreichen? Es gibt fast sicher einen besseren Weg. – Auraseer

Antwort

6

String.Format empfängt ein Zeichenfolgenargument mit format Wert und ein params object[] Array, das mit einem beliebig großen Wert Elemente behandeln kann.

Für jeden object Wert, dann ist es .ToString() Verfahren, das Formatmuster zu lösen genannt wird

EDIT: Scheint ich Ihre Frage falsch verstanden. Wenn Sie wissen möchten, wie viele Argumente für Ihr Format erforderlich sind, können Sie entdecken, dass durch einen regulären Ausdruck:

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 

Wie Benjamin in den Kommentaren erwähnt, vielleicht brauchen Sie Anzahl der verschiedenen Referenzen kennen. Wenn Sie nicht Linq verwenden, hier gehen Sie:

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 auch Adresse @280Z28 letztes Problem entdeckt.

Bearbeiten von 280Z28: Dies wird die Eingabe nicht bestätigen, sondern für jede gültige Eingabe wird die richtige Antwort geben:

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; 
+0

Ihr fangt nicht "Fehler: {0} {{{1}}}" 'oder" Fehler: {0} ({0}) "'. –

+0

Und das OP möchte die Anzahl der Objekte wissen, die an den Aufruf übergeben werden sollen, afaik - also benötigt er nicht die Anzahl der Referenzen, sondern die Anzahl der verschiedenen Referenzen. "{0} {0} {1}" würde wahrscheinlich als "2" in seiner Welt zählen. Dies ist jedoch sehr einfach von Ihrem Ausdruck. Nett. –

+0

@Rubens: Ja, du hast die erste, aber nicht die zweite. Sie müssen die Übereinstimmungen mit einer Ganzzahl analysieren und das Maximum plus 1 annehmen. Hier ist ein anderes gültiges: '" {2} "' (drei Parameter, aber nur eine Ersetzung). –

1

Sie müssen durch die Zeichenfolge analysieren und den höchsten ganzzahligen Wert zwischen den {} finden ... dann einen hinzufügen.

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

Wie auch immer, es ist hässlich. Es würde mich interessieren zu wissen, warum Sie diese Zahl programmatisch herausfinden müssen.

EDIT

Wie 280Z28 erwähnt, werden Sie für die verschiedenen Eigentümlichkeiten zu berücksichtigen haben, was zwischen den {} 's (mehrere {}' s, Formatierung Strings, etc.) enthalten sein.

+2

Aber denken Sie daran, dass '{{Tricky}}' erscheinen kann, ebenso wie '{0: 0000}'. –

+0

also, warum brauche ich das? Ich arbeite mit OpenXML-Dokumenten, wo die Xpath-Abfragen in benutzerdefinierten XML-Teil der Word-Dokumente platziert werden. In meinem Code muss ich die Parameter in der Xpath-Abfrage durch Werte ersetzen, die auf dem Kontext dieses XPath basieren. Die Anzahl der Parameter innerhalb der verschiedenen XPaths im Dokument wird variieren. Wenn ich also die Anzahl der Parameter, die der String akzeptiert, finden kann, kann ich ein if-else verwenden, um den richtigen String auszuführen.Format Ich hoffe, ich habe das klar erklärt. –

+0

Im Grunde müssen Sie die erste Hälfte der Methodenimplementierung des StringBuilder.AppendFormat (IFormatProvider-Provider, Zeichenfolgenformat, Parameterobjekt [] Arge) implementieren (~ 75 Codezeilen), um alle Idiosynkrasien zu behandeln. –

1

ich auf ReSharper verlassen, dass für mich zu analysieren, und es ist schade, dass Visual Studio wird nicht mit einer solchen Funktion geliefert.

Verwandte Themen