Avant d'utiliser String.Format pour formater une chaîne en C #, j'aimerais savoir combien de paramètres cette chaîne accepte cette chaîne? p>
pour par exemple. Si la chaîne était "{0} n'est pas la même chose que {1}", je voudrais savoir que cette chaîne accepte deux paramètres Pour par exemple. Si la chaîne était "{0} n'est pas la même que {1} et {2}", la chaîne accepte 3 paramètres p>
Comment puis-je trouver cela efficacement? p>
3 Réponses :
Vous devrez analyser la chaîne et trouver la valeur entière la plus élevée entre le ... ou comptez le nombre d'ensembles de De toute façon, c'est moche. Je serais intéressé de savoir pourquoi vous devez être capable de comprendre ce numéro de manière programmatique. P>
As 280z28 mentionné, vous devrez tenir compte des différentes idiosyncrasies de ce qui peut être inclus entre le {} code> 's ... puis ajoutez un. p>
{} code>'s. p>
{} code> 's (multiple
{} code> S, formatage cordes, etc.). p>
Mais rappelez-vous que {{tressy}} code> peut apparaître, comme cela peut
{0: 0000} code>.
Alors, pourquoi ai-je besoin de ça? Je travaille avec des documents OpenXML où les requêtes XPath sont placées dans une partie XML personnalisée de Word Docs. Dans mon code, je dois remplacer les paramètres de la requête XPath avec des valeurs en fonction du contexte de cette XPath. Le nombre de paramètres dans les différents XPATHS du document variera donc de sorte que si je peux trouver le nombre de paramètres, la chaîne accepte, je peux utiliser une autre en fonction de celle-ci pour effectuer la chaîne correcte.format, j'espère que j'ai clairement expliqué cela clairement .
Fondamentalement, vous devez vous implémenter la première moitié du stringbuilder.appendormat (fournisseur iformatProvider, format de chaîne, objet parames [] args) code> Méthode implémentation (~ 75 lignes de code) pour gérer toutes les idiosyncrasies.
pour chaque objet comme Benjamin noté dans les commentaires, vous devez peut-être connaître le numéro de différentes références em>. Si vous n'utilisez pas Linq, vous allez ici: P> string.format code> reçoit un argument de chaîne avec
Format code> Valeur et un objet
parames [] code> tableau, qui peut traiter avec une grande taille arbitraire Valeur Articles.
objet code>, c'est
.tostring () code> méthode sera appelé pour résoudre ce motif de format p>
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;
Vous n'atteignez pas "échec: {0} {{{1}}}" code> ou
"échec: {0} ({0})" code>.
Et l'OP veut connaître le nombre d'objets à passer à l'appel, AFaik - il n'a donc pas besoin du nombre de références, mais le nombre de références différentes. "{0} {0} {1}" Comptez probablement comme "2" dans son monde. C'est très facile de votre expression cependant. Joli.
@Rubens: Oui, vous avez eu la première d'entre eux mais pas la seconde. Vous devez analyser les correspondances un entier et prendre le max plus 1. Voici une autre personne valide: "{2}" code> (trois paramètres, mais une seule substitution).
@ 280z28, vous y allez à nouveau; S'il vous plaît, laissez-moi retourner au travail et arrêter de tester =)
@Benjamin, j'ai mis à jour cette réponse basée sur vos commentaires, mais supprimé distinct (). Compte () code> Pour ajouter
max () + 1 code> par demande @ 280Z28.
@Rubens: étant donné que format code> jette une formatException pour la chaîne (CLOSED)
"{0" code>, vous pouvez simplifier votre expression correspondante à juste
@ "\ {(\ \ d +) " code>.
Étant donné que max code> pour une entrée vide, j'ai ajouté le syndicat avec une seule entrée -1, renvoyant 0 en tant que paramètre compte pour les chaînes sans paramètres.
string.replace code> a une meilleure performance que
regex.replace CODE>, et puisque vous savez qu'il existe exactement 1 groupe pertinent pour chaque match que vous pouvez utiliser SELECT au lieu de SelectMany.
Je compte sur Restomer pour analyser cela pour moi, et il est dommage que Visual Studio ne soit pas expédié avec une caractéristique aussi nette. P>
Ce n'est pas facile. Qu'est-ce que vous essayez d'accomplir? Il y a presque certainement un meilleur moyen d'y aller.