Quel est le moyen le plus efficace de convertir un dictionnaire en une chaîne formatée.
par exemple: p>
Ma méthode: p>
public string DictToString(Dictionary<string, string> items, string format){ format = String.IsNullOrEmpty(format) ? "{0}='{1}' " : format; string itemString = ""; foreach(var item in items){ itemString = itemString + String.Format(format,item.Key,item.Value); } return itemString; }
7 Réponses :
Je viens de réécrire votre version d'être un peu plus générique et d'utiliser stringbuilder code>:
Cela ne fonctionnera pas comme vous le pensez - IMINITIONNAIRE
IMOITION
Cela a l'air bien, +1 pour utiliser ienumerable
Et avec format = `" \ t {{{{{0}, {1}}}, \ n "`, vous obtenez la sortie appropriée pour la copype en C #!
public string DictToString<TKey, TValue>(Dictionary<TKey, TValue> items, string format) { format = String.IsNullOrEmpty(format) ? "{0}='{1}' " : format; return items.Aggregate(new StringBuilder(), (sb, kvp) => sb.AppendFormat(format, kvp.Key, kvp.Value)).ToString(); }
Je pense que vous pouvez utiliser iThictionnaire code>
gabe, si vous allez être générique, soyez générique:
J'imensais à l'origine générique dans le sens "Utilisations au lieu du sens du dictionnaire", mais je faisais déjà ce que vous avez suggéré que vous avez posté le vôtre.
@GABE: La chose est que je ne pense pas que vous puissiez passer un dictionnaire
Tu as raison; Je viens de poster avant que j'avais vraiment fait écrire la fichue chose.
@Gabe, @james: stringbuilder code> est suivant surcharge:
appendormat (chaîne, objet, objet) code> afin que vous puissiez utiliser la clé générique et la valeur
@ABatisHchev; Je n'étais pas inquiet pour StressBuilder. Gabe avait changé la signature de la fonction.
Je pense que l'efficacité n'est guère une préoccupation avec seulement 10 chaînes, mais vous ne voulez peut-être pas compter sur cela que dix.
La concaténation des chaînes crée un nouvel objet à chaîne en mémoire, car les objets de chaîne sont immuables. Cela suggère également d'autres opérations de chaîne peut créer de nouvelles instances, telles que remplacer. Généralement, cela est évité à l'aide de StringBuilder. P>
StringBuilder l'évite d'utiliser un tampon qu'il fonctionne; Lorsque la valeur du StringBuilder est concaténée avec une autre chaîne, le contenu est ajouté à la fin du tampon. p>
Cependant, il y a des mises en garde, voir Ce paragraphe : P>
Considérations sur la performance forte> p> [...] p>
la performance d'une concaténation opération pour une chaîne ou L'objet StringBuilder dépend de la façon dont Souvent, une allocation de mémoire se produit. UNE Fonctionnement de la concaténation à chaîne Toujours alloue la mémoire, alors qu'un Opération de concaténation StringBuilder attribue seulement la mémoire si le Le tampon d'objet stringbuilder est trop petit pour accueillir les nouvelles données. Par conséquent, la classe de cordes est préférable pour une concaténation opération si un nombre fixe de chaîne les objets sont concaténés. Dans ce cas, la concaténation individuelle les opérations peuvent même être combinées dans une seule opération par le compilateur. UNE L'objet StringBuilder est préférable pour une opération de concaténation si un Nombre arbitraire de chaînes sont concaténé; Par exemple, si une boucle concaténe un nombre aléatoire de Cordes d'entrée utilisateur. P> blockquote>
un cas de sorte (artifuliété) comme celui-ci ne devrait probablement pas être remplacé par StringBuilder: p>
xxx pré> ... Comme le compilateur pourrait pouvoir réduire ce à une forme plus efficace. Il est également fortement discutable si cela serait assez inefficace pour la matière dans le plus grand schéma des choses. P>
Suivre les recommandations de Microsoft, vous souhaitez probablement utiliser StressBuilder (comme l'autre spectacle de réponses hautement adéquates.) P> p>
Nitpick: le fait que la concaténation des chaînes à l'aide de l'opérateur code> crée une nouvelle chaîne code> Les objets de la mémoire sont en réalité non liés au fait que le type code> de chaîne code> est immutable (bien que les deux soient vrais).
@Dan Tao: Je suis un peu épais pour le moment, pourriez-vous élaborer pourquoi? Il semble que String + String Operations Obtenez un traitement spécial du compilateur, cela a-t-il quelque chose à voir avec cela?
@Skurmedal: Donc, l'opérateur + code> est statique, prend deux arguments et renvoie une nouvelle valeur. Vous pouvez y penser, vraiment, comme une méthode statique. Maintenant, simplement parce qu'une méthode accepte deux arguments et renvoie une nouvelle valeur n'implique pas que le type des arguments est immuable. Je pourrais
Concat Code> Deux
Liste
iEnumerable
liste
concat code> fonctionne. Donc, même si
string code> est immuable, il pourrait tout aussi facilement pas i> être - en ce qui concerne la concaténation.
@Skurmedal: Pour le mettre un autre moyen: chaque fois que j'écris x = y + z; code> je donne une nouvelle valeur à la variable
x code>. Ceci n'est pas liée à savoir si le type
x code> est immuable. Type immuable ou non, Affectation d'une nouvelle valeur i> est Toujours i> va changer ce qui est stocké dans une variable. Donc
x = y + z; code> va changer ce qui est à
x code>, aucune question. Ce qui est vraiment bizarre i> de penser est que si le type était mutable i>, vous pouvez éventuellement écrire l'énoncé
x = y + z; code> et modifie effectivement la valeur de
y code> ou
z code> i> (ou les deux!) - Si l'opérateur
+ code> pour ce type était défini pour le faire.
Cette méthode utilisé à la prochaine méthode: p> convertira p> ou p> à p> N'oubliez pas une surcharge: p> Vous pouvez utiliser générique et aussi loin que "Code> ITHINGER tkey code> /
tvalue code> car n'importe quel objet a
Tostring () code> qui sera utilisé par
string.format () code>. P>
IEnumerable
Version améliorée sligtuly des autres réponses, utilisant des méthodes d'extension et des paramètres par défaut, ainsi que des paires de touches / valeur d'emballage dans {}: La méthode peut alors être appelée directement à partir du dictionnaire / Enumérable: p>
C'est la solution la plus propre.
Dictionnaire format dans une ligne avec linq et string.join () (c # 6.0): Vous pouvez créer une méthode d'extension simple comme ceci: p>
Je pense que c'est assez efficace; Il suffit de le changer pour utiliser un
stringbuilder code> au lieu de la concaténation de la chaîne et vous devez être défini.