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