2010-01-28 22 views
9

Antes de usar String.Format para formatear una cadena en C#, me gustaría saber cuántos parámetros acepta esa cadena?Cadena tiene cuántos parámetros

Por ej. si la cadena era "{0} no es lo mismo que {1}", me gustaría saber que esta cadena acepta dos parámetros Por ej. si la cadena era "{0} no es lo mismo que {1} y {2}", la cadena acepta 3 parámetros

¿Cómo puedo encontrar esto de manera eficiente?

+0

Esto no es fácil. ¿Qué está tratando de lograr? Es casi seguro que hay una mejor manera de hacerlo. – Auraseer

Respuesta

6

String.Format recibe un argumento de cadena con format valor, y una serie params object[], lo que puede hacer frente a una arbitrarias artículos de gran valor.

Por cada valor object, es .ToString() método será llamado a resolver ese patrón de formato

EDIT: Parece leí mal su pregunta. Si desea saber cuántos argumentos son necesarios para su formato, puede descubrir que mediante el uso de una expresión regular:

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 

Como Benjamin señaló en los comentarios, tal vez usted no necesita saber el número de diferentes referencias. Si no usando LINQ, aquí van:

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 

Esta dirección también @280Z28 último problema descubierto.

Editar por 280Z28: Esto no va a validar la entrada, pero para cualquier entrada válida dará la respuesta correcta:

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

El tuyo no capta '" Error: {0} {{{1}}} "' o '" Error: {0} ({0}) "'. –

+0

Y el OP quiere saber la cantidad de objetos para pasar a la llamada, afaik, por lo que no necesita el número de referencias, sino el número de referencias diferentes. "{0} {0} {1}" probablemente contaría como "2" en su mundo. Sin embargo, esto es muy fácil de tu expresión. Bonito. –

+0

@Rubens: Sí, tienes la primera pero no la segunda. Tienes que analizar las coincidencias an un entero y tomar el máximo más 1. Aquí hay otra válida: '" {2} "' (tres parámetros, pero solo una sustitución). –

1

Tendrás que analizar la cadena y encontrar el valor entero más alto entre los {} 's ... luego agregar uno.

... o cuente el número de conjuntos de {} 's.

De cualquier manera, es feo. Me interesaría saber por qué necesita poder calcular este número programáticamente.

EDITAR

Como 280Z28 mencionado, tendrá que dar cuenta de las diversas idiosincrasias de lo que puede incluirse entre los {} 's (múltiples {}' s, cadenas de formato, etc.).

+2

Pero recuerda que '{{Tricky}}' puede aparecer, al igual que '{0: 0000}'. –

+0

entonces, ¿por qué necesito esto? Estoy trabajando con documentos OpenXML donde las consultas xpath se colocan dentro de la parte xml personalizada de los documentos de Word. En mi código, necesito reemplazar los parámetros dentro de la consulta xpath con valores basados ​​en el contexto de ese xpath. El número de parámetros dentro de los diferentes xpaths en el documento variará, así que si puedo encontrar la cantidad de parámetros que acepta la cadena, puedo usar un if-else basado en eso para realizar la cadena correcta.Formato Espero haber explicado esto claramente. –

+0

Básicamente, debe implementarse la primera mitad del método 'StringBuilder.AppendFormat (proveedor de proveedores IFormat, formato de cadena, objeto params [] args)' implementación del método (~ 75 líneas de código) para manejar todas las idiosincrasias. –

1

que dependen de ReSharper para analizar que para mí, y es una lástima que Visual Studio no incluye una característica tan clara.

Cuestiones relacionadas