10
votes

La chaîne a combien de paramètres

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?

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

Comment puis-je trouver cela efficacement?


1 commentaires

Ce n'est pas facile. Qu'est-ce que vous essayez d'accomplir? Il y a presque certainement un meilleur moyen d'y aller.


3 Réponses :


1
votes

Vous devrez analyser la chaîne et trouver la valeur entière la plus élevée entre le {} 's ... puis ajoutez un.

... ou comptez le nombre d'ensembles de {} 's.

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.

Modifier

As 280z28 mentionné, vous devrez tenir compte des différentes idiosyncrasies de ce qui peut être inclus entre le {} 's (multiple {} S, formatage cordes, etc.).


3 commentaires

Mais rappelez-vous que {{tressy}} peut apparaître, comme cela peut {0: 0000} .


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) Méthode implémentation (~ 75 lignes de code) pour gérer toutes les idiosyncrasies.



8
votes

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.

pour chaque objet objet code>, c'est .tostring () code> méthode sera appelé pour résoudre ce motif de format p>

modifier : strong> semble avoir mal interprété votre question. Si vous voulez savoir combien d'arguments sont requis à votre format, vous pouvez découvrir qu'en utilisant une expression régulière: p> xxx pré>

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>

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;


7 commentaires

Vous n'atteignez pas "échec: {0} {{{1}}}" ou "échec: {0} ({0})" .


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}" (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 () Pour ajouter max () + 1 par demande @ 280Z28.


@Rubens: étant donné que format jette une formatException pour la chaîne (CLOSED) "{0" , vous pouvez simplifier votre expression correspondante à juste @ "\ {(\ \ d +) ".


Étant donné que max 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 a une meilleure performance que regex.replace , et puisque vous savez qu'il existe exactement 1 groupe pertinent pour chaque match que vous pouvez utiliser SELECT au lieu de SelectMany.



1
votes

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.


0 commentaires