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;
Esto no es fácil. ¿Qué está tratando de lograr? Es casi seguro que hay una mejor manera de hacerlo. – Auraseer