158 votes

Chaîne nommée mise en forme en c#

Est-il possible de formater une chaîne de caractères par nom plutôt que de la position en C#?

En python, je peux faire quelque chose comme ceci par exemple (sans vergogne volés à partir d' ici):

>>> print '%(language)s has %(#)03d quote types.' % \
      {'language': "Python", "#": 2}
Python has 002 quote types.

Est-il possible de faire cela en C#? Dire, par exemple:

String.Format("{some_variable}: {some_other_variable}", ...);

Être en mesure de le faire à l'aide d'un nom de variable serait sympa, mais un dictionnaire est acceptable aussi.

Mise à JOUR: j'ai fini par faire quelque chose comme ce post, mais c'est définitivement pas assez. Je vais essayer de John Sheehan, approche, mais si quelqu'un a d'autres suggestions dans l'intervalle, n'hésitez pas à les ajouter. :)

Mise à JOUR 2: John Sheehan, approche fonctionne assez bien. De l'accepter.

133voto

Runscope API Tools Points 43859

Il n'existe pas de méthode intégrée pour gérer cela.

Voici une méthode

string myString = "{foo} is {bar} and {yadi} is {yada}".Inject(o);

Voici un autre

Status.Text = "{UserName} last logged in at {LastLoginDate}".FormatWith(user);

Une troisième méthode améliorée basée en partie sur les deux ci-dessus, à partir de Phil Haack

45voto

Haacked Points 31070

J’ai une implémentation je viens de poster sur mon blog ici : http://haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx

Il aborde certaines questions que ces autres implémentations entretiennent avec renfort de s’échapper. Le poste comporte des détails. Il ne la chose DataBinder.Eval trop, mais il est toujours très rapide.

40voto

Doggett Points 1920

Vous pouvez également utiliser des types anonymes comme ceci :

Bien sûr, il faudrait plus de code si vous souhaitez également analyser la mise en forme, mais vous pouvez mettre en forme une chaîne à l’aide de cette fonction comme :

14voto

spoulson Points 13391

Il ne semble pas être un moyen de le faire hors de la boîte. Cependant, il semble possible de mettre en place votre propre `` qui relie à un `` pour les valeurs.

Sorties :

Python possède 2 types de citation

L’inconvénient est que vous ne pouvez pas mélanger `` , de sorte que la mise en forme de texte fantaisie ne peut être utilisé en même temps.

9voto

Lucas Points 10415

Le cadre lui-même ne fournit pas un moyen de faire cela, mais vous pouvez prendre un coup d'oeil à ce post par Scott, Hanselman. Exemple d'utilisation:

Person p = new Person();  
string foo = p.ToString("{Money:C} {LastName}, {ScottName} {BirthDate}");  
Assert.AreEqual("$3.43 Hanselman, {ScottName} 1/22/1974 12:00:00 AM", foo);

Ce code par James Newton-King est similaire et travaille avec des sous-propriétés et les index,

string foo = "Top result for {Name} was {Results[0].Name}".FormatWith(student));

James du code s'appuie sur le Système.Web.L'INTERFACE utilisateur.DataBinder pour analyser la chaîne et nécessite du Système de référence.Web, que certaines personnes n'aiment pas faire dans les applications non web.

EDIT: Oh, et ils fonctionnent bien avec les types anonymes, si vous n'avez pas un objet avec des propriétés prêt pour cela:

string name = ...;
DateTime date = ...;
string foo = "{Name} - {Birthday}".FormatWith(new { Name = name, Birthday = date });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X