que tienen una cadena de plantilla y una serie de parámetros que provienen de diferentes fuentes, pero necesitan ser emparejados para crear una nueva cadena "rellenado":¿Hay una manera mejor de contar marcadores de posición de formato de cadena en una cadena en C#?
string templateString = GetTemplate(); // e.g. "Mr {0} has a {1}"
string[] dataItems = GetDataItems(); // e.g. ["Jones", "ceiling cat"}
string resultingString = String.Format(templateString, dataItems);
// e.g. "Mr Jones has a ceiling cat"
Con este código, estoy asumiendo que la cantidad de marcadores de posición de formato de cadena en la plantilla será igual a la cantidad de elementos de datos. En general, es una suposición razonable en mi caso, pero quiero poder producir un resultingString
sin fallar incluso si la suposición es incorrecta. No me importa si hay espacios vacíos para los datos faltantes.
Si hay demasiados elementos en dataItems
, el método String.Format
lo maneja bien. Si no hay suficiente, obtengo una excepción.
Para superar esto, estoy contando el número de marcadores de posición y agregando nuevos elementos a la matriz de elementos de datos si no hay suficientes.
para contar los marcadores de posición, el código que estoy trabajando en este momento es:
private static int CountOccurrences(string haystack)
{
// Loop through all instances of the string "}".
int count = 0;
int i = 0;
while ((i = text.IndexOf("}", i)) != -1)
{
i++;
count++;
}
return count;
}
Obviamente esto hace la suposición de que no hay llaves de cierre que no están siendo utilizados para el formato marcadores de posición. También solo se siente mal. :)
¿Hay una manera mejor de contar los marcadores de posición de formato de cadena en una cadena?
Varias personas han señalado correctamente que la respuesta que marca como correcto no funcionará en muchas circunstancias. Las razones principales son:
- expresiones regulares que cuentan el número de marcadores de posición no tiene en cuenta para los frenos literales (
{{0}}
) - marcadores de posición de conteo no tiene en cuenta repetidas o saltado marcadores de posición (por ejemplo
"{0} has a {1} which also has a {1}"
)
Mientras no conteste su pregunta, esta publicación puede ofrecerle una alternativa que puede resultarle interesante http://stackoverflow.com/questions/159017/named-string-formatting-in-c – Kane