web-dev-qa-db-fra.com

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

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

J'ai besoin de 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.

34
S G

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 pourrait être jeté si le texte n'est pas au bon format et un ArgumentException sera jeté s'il y a des clés en double. Chacun de ces scénarios nécessitera des modifications différentes. Si un espace blanc redondant peut être présent, vous devrez peut-être string.Trim appelle si nécessaire.

82
Ani

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

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]);
17
Bivoauc

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

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

Voici les superbes espaces blancs ignorés, corrigeant la dernière valeur ayant ou non le pouvoir 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'aurais jamais pensé à ça.

9
Kevin Stricker

Vous pouvez l'écrire comme ceci ou faire une boucle dessus pour le faire vous-même. D'une manière ou d'une autre. En fin de compte, vous 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 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]);
}
6
Anthony Pegram