Convertir Dictionary <string, string> en chaîne séparée par des points-virgules en c #


135

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: "A=1;B=2;C=3;D=4"

Un exemple d'implémentation:

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 contient probablement moins de 10 éléments, ce qui suggère qu'un StringBuilder est excessif.

Quelles implémentations alternatives sont plus succinctes / efficaces? Le framework a-t-il des fonctionnalités qui vous aideront?

Réponses:


290
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' ToArrayappel final .)


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

7
@Amittai, @the_drow: Vous préférerez peut-être string.Format; Je préfère k+"="+vles concaténations simples comme celle-ci. Chacun à leur propre je suppose ...
LukeH

2
Notez que l'appel à ToArray()n'est pas nécessaire. Le supprimer entraîne un appel à String.Join<String>(String, IEnumerable<String>)au lieu de String.Join(String, String[]).
Dan Stevens

8
Si vous ne vous souciez pas du format de sortie exact, vous pouvez le faire string.Join(", ", myDict). Il sortira sous la forme[A, 1], [B, 2], [C, 3], [D, 4]
altumano

2
@SRJ Empty est très différent de Null .... Empty "" , ou Whitespace " ", sont des clés valides dans un dictionnaire. Bien qu'il ne soit pas conseillé de les utiliser non plus, ce sont des valeurs valides. Vous devez ContainsKeyvérifier si vous avez besoin d'un nom de clé spécifique ou d'une construction de langage équivalente à foreachpour capturer les valeurs.
GoldBishop

39

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

style linq parfait!
menkow

1

Pour que Linq travaille plus Dictionary vous avez besoin d'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(); 

myDesiredOutput:

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

-3

C'est la même réponse que @LukeH a ci-dessus.
Rick Glos

mec ce n'est pas la même chose, il n'est pas nécessaire d'utiliser ToArray (). S'il vous plaît, ne rejetez pas ma réponse.
Jaydeep Shil

2
C'est la même chose - il mentionne la suppression de ToArray()lors de l'utilisation de versions supérieures du framework.
Rick Glos
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.