2010-11-10 26 views
25

J'ai une chaîne au format "clé1 = valeur1; clé2 = valeur2; clé3 = valeur3;"Convertir une chaîne délimitée en dictionnaire <chaîne, chaîne> en C#

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

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

+6

C'est essentiellement un double de cette question: http://stackoverflow.com/questions/776107/best-way-to-convert- query-string-to-dictionary-in-c Je suppose que vous devrez remplacer votre ';' par '&' avant que cela fonctionne. –

Répondre

5

Vous pouvez l'écrire comme ceci ou faire une boucle pour le faire vous-même. D'une manière ou d'une autre. En fin de compte, vous divisez sur ; pour obtenir les paires d'articles, 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 Loop:

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]); 
} 
64

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 satisfaites. Par exemple, un IndexOutOfRangeException peut être lancé si le texte n'est pas dans le bon format et un ArgumentException sera levé s'il y a des clés en double. Chacun de ces scénarios nécessitera différentes modifications. Si un espace blanc redondant peut être présent, vous pouvez avoir besoin d'appels string.Trim si nécessaire.

+0

+1 pour le .ToDictionary - lisse –

11

Mis à jour Ani pour prendre en compte le point virgule à la fin. La clause where garantit que vous disposez d'une clé et d'une valeur avant la création et l'entrée.

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

Voici, les espaces blancs impressionnant ignorant, la correction pour la dernière valeur ayant ou non ayant un pouvoir d'expressions régulières virgule:

 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'aurais jamais pensé à ça.

5

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'}");