11
votes

Dictionnaire le plus efficace .tostring () avec formatage?

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;
}


1 commentaires

Je pense que c'est assez efficace; Il suffit de le changer pour utiliser un stringbuilder au lieu de la concaténation de la chaîne et vous devez être défini.


7 Réponses :


23
votes

Je viens de réécrire votre version d'être un peu plus générique et d'utiliser stringbuilder : xxx


3 commentaires

Cela ne fonctionnera pas comme vous le pensez - IMINITIONNAIRE n'est pas compatible avec IMOITION - Vous pouvez faire la valeur générique.


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 #!



16
votes
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();
}

1 commentaires

Je pense que vous pouvez utiliser iThictionnaire



0
votes

gabe, si vous allez être générique, soyez générique: xxx


5 commentaires

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 sous forme de dialogue


Tu as raison; Je viens de poster avant que j'avais vraiment fait écrire la fichue chose.


@Gabe, @james: stringbuilder est suivant surcharge: appendormat (chaîne, objet, objet) 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.



1
votes

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.

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.

Cependant, il y a des mises en garde, voir Ce paragraphe :

Considérations sur la performance

[...]

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.

un cas de sorte (artifuliété) comme celui-ci ne devrait probablement pas être remplacé par StringBuilder: xxx

... 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.

Suivre les recommandations de Microsoft, vous souhaitez probablement utiliser StressBuilder (comme l'autre spectacle de réponses hautement adéquates.)


4 commentaires

Nitpick: le fait que la concaténation des chaînes à l'aide de l'opérateur crée une nouvelle chaîne Les objets de la mémoire sont en réalité non liés au fait que le type de chaîne 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 + 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 Deux Liste Objets ensemble Pour obtenir un nouveau iEnumerable sans affecter ni < / code>; Ce ne serait pas parce que liste est immuable (ce n'est pas). Ce serait juste la façon dont concat fonctionne. Donc, même si string est immuable, il pourrait tout aussi facilement pas être - en ce qui concerne la concaténation.


@Skurmedal: Pour le mettre un autre moyen: chaque fois que j'écris x = y + z; je donne une nouvelle valeur à la variable x . Ceci n'est pas liée à savoir si le type x est immuable. Type immuable ou non, Affectation d'une nouvelle valeur est Toujours va changer ce qui est stocké dans une variable. Donc x = y + z; va changer ce qui est à x , aucune question. Ce qui est vraiment bizarre de penser est que si le type était mutable , vous pouvez éventuellement écrire l'énoncé x = y + z; et modifie effectivement la valeur de y ou z (ou les deux!) - Si l'opérateur + pour ce type était défini pour le faire.



9
votes

Cette méthode xxx

utilisé à la prochaine méthode: xxx

convertira xxx < p> à xxx

ou xxx

à xxx

N'oubliez pas une surcharge: xxx

Vous pouvez utiliser générique tkey / tvalue car n'importe quel objet a Tostring () qui sera utilisé par string.format () .

et aussi loin que "Code> ITHINGER est IEnumerable > Vous pouvez utiliser n'importe lequel. Je préfère la natricication pour plus d'expressivité de code.


0 commentaires

2
votes

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 {}: xxx

La méthode peut alors être appelée directement à partir du dictionnaire / Enumérable: xxx


1 commentaires

C'est la solution la plus propre.



3
votes

Dictionnaire format dans une ligne avec linq et string.join () (c # 6.0): xxx

Vous pouvez créer une méthode d'extension simple comme ceci: xxx < / pré>


0 commentaires