Existe-t-il un moyen de formater une chaîne par son nom plutôt que par sa position en C #?
En python, je peux faire quelque chose comme cet exemple (volé sans vergogne d' ici ):
>>> print '%(language)s has %(#)03d quote types.' % \
{'language': "Python", "#": 2}
Python has 002 quote types.
Existe-t-il un moyen de le faire en C #? Dites par exemple:
String.Format("{some_variable}: {some_other_variable}", ...);
Pouvoir le faire en utilisant un nom de variable serait bien, mais un dictionnaire est également acceptable.
c#
.net-3.5
string-formatting
Jason Baker
la source
la source
Réponses:
Il n'y a pas de méthode intégrée pour gérer cela.
Voici une méthode
Voici un autre
Une troisième méthode améliorée partiellement basée sur les deux ci - dessus , de Phil Haack
la source
J'ai une implémentation que je viens de publier sur mon blog ici: http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx
Il résout certains problèmes que ces autres implémentations ont avec l'échappement d'accolades. Le message contient des détails. Il fait aussi la chose DataBinder.Eval, mais est toujours très rapide.
la source
Des chaînes interpolées ont été ajoutées dans C # 6.0 et Visual Basic 14
Les deux ont été introduits via le nouveau compilateur Roslyn dans Visual Studio 2015 .
C # 6.0:
return "\{someVariable} and also \{someOtherVariable}"
OUreturn $"{someVariable} and also {someOtherVariable}"
source: quoi de neuf en C # 6.0
VB 14:
return $"{someVariable} and also {someOtherVariable}"
Fonctionnalités remarquables (dans l'IDE de Visual Studio 2015):
{index}
fonctionne, mais aussi{(index + 1).ToString().Trim()}
Prendre plaisir! (& cliquez sur "Envoyer un sourire" dans le VS)
la source
Vous pouvez également utiliser des types anonymes comme celui-ci:
Bien sûr, il faudrait plus de code si vous souhaitez également analyser le formatage, mais vous pouvez formater une chaîne en utilisant cette fonction comme:
la source
Il ne semble pas y avoir de moyen de le faire hors de la boîte. Cependant, il semble possible de mettre en œuvre les vôtres
IFormatProvider
qui sont liés àIDictionary
des valeurs for.Les sorties:
La mise en garde est que vous ne pouvez pas mélanger
FormatProviders
, donc le formatage de texte sophistiqué ne peut pas être utilisé en même temps.la source
Le cadre lui-même ne fournit pas un moyen de le faire, mais vous pouvez jeter un œil à cet article de Scott Hanselman. Exemple d'utilisation:
Ce code de James Newton-King est similaire et fonctionne avec des sous-propriétés et des index,
Le code de James s'appuie sur System.Web.UI.DataBinder pour analyser la chaîne et nécessite de référencer System.Web, ce que certaines personnes n'aiment pas faire dans des applications non Web.
EDIT: Oh et ils fonctionnent bien avec les types anonymes, si vous n'avez pas d'objet avec des propriétés prêtes pour cela:
la source
Voir /programming/271398?page=2#358259
Avec l'extension liée, vous pouvez écrire ceci:
et vous obtiendrez
"foo 2 System.Object
".la source
Je pense que le plus proche que vous obtiendrez est un format indexé:
Il y a aussi String.Replace (), si vous êtes prêt à le faire en plusieurs étapes et à croire que vous ne trouverez vos `` variables '' nulle part ailleurs dans la chaîne:
Étendre ceci pour utiliser une liste:
Vous pouvez également le faire avec un Dictionary <string, string> en itérant ses collections .Keys, mais en utilisant une List <KeyValuePair <string, string >>, nous pouvons tirer parti de la méthode .ForEach () de List et la condenser en un monoplace:
Un lambda serait encore plus simple, mais je suis toujours sur .Net 2.0. Notez également que les performances de .Replace () ne sont pas excellentes lorsqu'elles sont utilisées de manière itérative, car les chaînes de .Net sont immuables. De plus, cela nécessite que la
MyString
variable soit définie de telle manière qu'elle soit accessible au délégué, donc ce n'est pas encore parfait.la source
Ma bibliothèque open source, Regextra , prend en charge le formatage nommé (entre autres). Il cible actuellement .NET 4.0+ et est disponible sur NuGet . J'ai également un article de blog à ce sujet: Regextra: vous aider à réduire vos (problèmes) {2} .
Le bit de formatage nommé prend en charge:
Exemple:
Résultat:
Consultez le lien GitHub du projet (ci-dessus) et le wiki pour d'autres exemples.
la source
Vérifier celui-ci:
Échantillon:
Les performances sont assez bonnes par rapport aux autres solutions.
la source
Je doute que ce soit possible. La première chose qui vous vient à l'esprit est de savoir comment allez-vous accéder aux noms de variables locales?
Il peut cependant y avoir un moyen intelligent d'utiliser les expressions LINQ et Lambda pour le faire.
la source
En voici un que j'ai fait il y a quelque temps. Il étend String avec une méthode Format prenant un seul argument. La bonne chose est qu'il utilisera la chaîne standard.Format si vous fournissez un argument simple comme un int, mais si vous utilisez quelque chose comme le type anonyme, cela fonctionnera aussi.
Exemple d'utilisation:
Cela aboutirait à "La famille Smith a 4 enfants".
Il ne fait pas de liaison folle comme les tableaux et les indexeurs. Mais c'est super simple et performant.
la source
Exemple:
Sortie: 你好, wayjet, 今天 是 04/05/2011, 这 是 你 第 18 次 登录 , 积分 {100.40}
la source
voici une méthode simple pour tout objet:
Et voici comment l'utiliser:
sortie: 27/02/2012
la source
J'ai implémenté c'est une classe simple qui duplique la fonctionnalité de String.Format (sauf lors de l'utilisation de classes). Vous pouvez utiliser un dictionnaire ou un type pour définir des champs.
https://github.com/SergueiFedorov/NamedFormatString
C # 6.0 ajoute cette fonctionnalité directement dans la spécification du langage, il en
NamedFormatString
va de même pour la compatibilité descendante.la source
J'ai résolu cela d'une manière légèrement différente des solutions existantes. Il fait le noyau du remplacement de l'élément nommé (pas le bit de réflexion que certains ont fait). C'est extrêmement simple et rapide ... Voici ma solution:
Il est utilisé de la manière suivante:
J'espère que quelqu'un trouvera cela utile!
la source
Même si la réponse acceptée donne de bons exemples, le .Inject ainsi que certains des exemples Haack ne gèrent pas les échappements. Beaucoup dépendent également fortement de Regex (plus lent) ou de DataBinder.Eval qui n'est pas disponible sur .NET Core et dans certains autres environnements.
Dans cet esprit, j'ai écrit un analyseur simple basé sur une machine à états qui diffuse les caractères, en écrivant dans une
StringBuilder
sortie, caractère par caractère. Il est implémenté en tant queString
méthode (s) d'extension et peut prendre à la fois unDictionary<string, object>
ouobject
avec des paramètres en entrée (en utilisant la réflexion).Il gère des niveaux illimités de
{{{escaping}}}
et jetteFormatException
lorsque l'entrée contient des accolades déséquilibrées et / ou d'autres erreurs.En fin de compte, toute la logique se résume en 10 états principaux - Pour lorsque la machine à états est en dehors d'un crochet et également à l'intérieur d'un crochet, le caractère suivant est soit une accolade ouverte, une accolade ouverte échappée, une accolade fermée, une accolade fermée échappée, ou un personnage ordinaire. Chacune de ces conditions est gérée individuellement à mesure que la boucle progresse, ajoutant des caractères à une sortie
StringBuffer
ou à une cléStringBuffer
. Lorsqu'un paramètre est fermé, la valeur de la cléStringBuffer
est utilisée pour rechercher la valeur du paramètre dans le dictionnaire, qui est ensuite poussée dans la sortieStringBuffer
. À la fin, la valeur de la sortieStringBuffer
est renvoyée.la source
Edit: Ce que j'aurais dû dire était: "Non, je ne crois pas que ce que vous voulez faire soit pris en charge par C #. C'est aussi proche que vous allez l'être."
la source
"someString" + someVariable + "someOtherString"
plus lisible. Cet article est d'accord avec vous.