2010-11-10 2 views
25

Ho una stringa del formato "key1 = value1; key2 = value2; key3 = value3;"Convertire una stringa delimitata in un dizionario <stringa, stringa> in C#

Ho bisogno di convertirlo in un dizionario per le coppie di valori chiave sopra menzionate.

Quale sarebbe il modo migliore per farlo? Grazie.

+6

Questo è fondamentalmente un duplicato di questa domanda: http://stackoverflow.com/questions/776107/best-way-to-convert- query-string-to-dictionary-in-c Suppongo che dovresti sostituire il tuo ';' con '&' prima che funzionerebbe comunque. –

risposta

5

Si potrebbe scrivere in questo modo o scorrere su di esso per farlo da soli. In entrambi i casi. In definitiva, ti dividi su ; per ottenere le coppie di articoli, quindi su = per ottenere la chiave e il valore. Versione Loop

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

:

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

qualcosa di simile?

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

Ovviamente, questo non funzionerà se le ipotesi non sono soddisfatte. Ad esempio, è possibile lanciare un IndexOutOfRangeException se il testo non è nel formato corretto e verrà generato uno ArgumentException se sono presenti chiavi duplicate. Ognuno di questi scenari richiederà modifiche diverse. Se potrebbero essere presenti spazi bianchi ridondanti, potrebbero essere necessarie alcune chiamate string.Trim secondo necessità.

+0

+1 per .ToDictionary - liscio –

11

Ani aggiornati per tenere conto del punto e virgola alla fine. La clausola where assicurerà di avere una chiave e un valore prima di creare e immettere.

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

Ecco l'impressionante spazi ignorando, correggendo per ultimo valore avere o non avere un potere e virgola delle espressioni regolari:

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

Ma sul serio, però, Ani merita puntelli per il .ToDictionary(). Non ci avrei mai pensato.

5

Si potrebbe fare questa stringa JSON utilizzando, ad esempio:

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