143 votes

Convertir un Dictionnaire<chaîne,chaîne> en chaîne séparée par un point-virgule en c#

Un simple pour commencer la journée, étant donné un Dictionary<string, string> comme suit :

var myDict = new Dictionary<string, string>();
myDict["A"] = "1";
myDict["B"] = "2";
myDict["C"] = "3";
myDict["D"] = "4";

Je souhaite créer une chaîne de caractères : "A=1;B=2;C=3;D=4"

Un exemple de mise en œuvre :

var myStringBuilder = new StringBuilder();
bool first = true;
foreach (KeyValuePair<string, string> pair in myDict)
{
    if (first)
    {
        first = false;
    }
    else
    {
        myStringBuilder.Append(";");
    }

    myStringBuilder.AppendFormat("{0}={1}", pair.Key, pair.Value);
}

var myDesiredOutput = myStringBuilder.ToString();

Notez que le dictionnaire est susceptible d'avoir moins de 10 éléments, ce qui suggère qu'un StringBuilder est superflu.

Quelles implémentations alternatives sont plus succinctes / efficaces ? Le cadre de travail possède-t-il des fonctionnalités qui pourraient être utiles ?

309voto

LukeH Points 110965
using System.Linq;

string s = string.Join(";", myDict.Select(x => x.Key + "=" + x.Value).ToArray());

(Et si vous utilisez .NET 4, ou une version plus récente, vous pouvez omettre l'élément final ToArray appel.)

0 votes

Joli :-) Cependant, j'utiliserais String.Format("{0}={1}", x.Key, x.Value) au lieu de l'opérateur +.

0 votes

Modifié en fonction des commentaires.

8 votes

@Amittai, @the_drow : Vous pourriez préférer string.Format Je préfère k+"="+v pour des concaténations simples comme celle-ci. Chacun son truc, je suppose...

40voto

Gibsnag Points 447

Une autre option consiste à utiliser l'extension Aggregate plutôt que Join :

String s = myDict.Select(x => x.Key + "=" + x.Value).Aggregate((s1, s2) => s1 + ";" + s2);

0 votes

Le style linq parfait !

2voto

c-chavez Points 1598

Pour que Linq fonctionne sur Dictionary vous devez au moins .Net v3.5 et using System.Linq; .

Quelques alternatives :

string myDesiredOutput = string.Join(";", myDict.Select(x => string.Join("=", x.Key, x.Value)));

ou

string myDesiredOutput = string.Join(";", myDict.Select(x => $"{x.Key}={x.Value}"));

Si vous ne pouvez pas utiliser Linq pour une raison quelconque, utilisez Stringbuilder :

StringBuilder sb = new StringBuilder();
var isFirst = true;
foreach(var x in myDict) 
{
  if (isFirst) 
  {
    sb.Append($"{x.Key}={x.Value}");
    isFirst = false;
  }
  else
    sb.Append($";{x.Key}={x.Value}"); 
}

string myDesiredOutput = sb.ToString(); 

monSortieSouhaitée :

A=1;B=2;C=3;D=4

-3voto

Jaydeep Shil Points 898

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