41 votes

Convertir une chaîne délimitée en dictionnaire<string,string> en C#

J'ai une chaîne du format "clé1=valeur1;clé2=valeur2;clé3=valeur3;"

Je dois le convertir en dictionnaire pour les paires clé-valeur mentionnées ci-dessus.

Quelle serait la meilleure façon de procéder? Merci.

98voto

Ani Points 59747

Quelque chose comme ça?

 var dict = text.Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries)
               .Select(part => part.Split('='))
               .ToDictionary(split => split[0], split => split[1]);

Bien sûr, cela échouera si les hypothèses ne sont pas remplies. Par exemple, un IndexOutOfRangeException peut être renvoyé si le texte n'est pas au bon format et un ArgumentException sera renvoyé s'il y a des clés en double. Chacun de ces scénarios nécessitera des modifications différentes. Si des espaces blancs redondants peuvent être présents, vous aurez peut-être besoin de certains string.Trim si nécessaire.

25voto

Bivoauc Points 513

Ani mis à jour pour prendre en compte le point-virgule à la fin. La clause where garantira que vous disposez d'une clé et d'une valeur avant de créer et d'entrer.

 var dictionary = "key1=value1;key2=value2;key3=value3;"
    .Split(';')
    .Select (part  => part.Split('='))
    .Where (part => part.Length == 2)
    .ToDictionary (sp => sp[0], sp => sp[1]);

13voto

Gerardo Garcia Points 125

Vous pouvez le faire en utilisant la chaîne JSON, par exemple :

 var dic = JsonConvert.DeserializeObject<Dictionary<int, string>>("{'1':'One','2':'Two','3':'Three'}");

12voto

Kevin Stricker Points 11294

Voici l'incroyable espace blanc ignorant, corrigeant la dernière valeur ayant ou non un pouvoir de point-virgule des expressions régulières :

         var dict = Regex.Matches("key1 = value1; key2 = value2 ; key3 = value3", @"\s*(.*?)\s*=\s*(.*?)\s*(;|$)")
        .OfType<Match>()
        .ToDictionary(m => m.Groups[1].Value, m => m.Groups[2].Value);

Mais sérieusement, Ani mérite des accessoires pour le .ToDictionary(). Je n'y aurais jamais pensé.

8voto

Anthony Pegram Points 58528

Vous pouvez l'écrire comme ceci ou le parcourir en boucle pour le faire vous-même. Dans les deux cas. En fin de compte, vous vous divisez sur ; pour obtenir les paires d'éléments, puis sur = pour obtenir la clé et la valeur.

 string input = "key1=value1;key2=value2;key3=value3;";
Dictionary<string, string> dictionary =
    input.TrimEnd(';').Split(';').ToDictionary(item => item.Split('=')[0], item => item.Split('=')[1]);

Version en boucle :

 Dictionary<string, string> dictionary = new Dictionary<string, string>();
string[] items = input.TrimEnd(';').Split(';');
foreach (string item in items)
{
    string[] keyValue = item.Split('=');
    dictionary.Add(keyValue[0], keyValue[1]);
}

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