2010-11-10 38 views
25

Tengo una cadena del formato "clave1 = valor1; clave2 = valor2; clave3 = valor3;"Convierta una cadena delimitada a un diccionario <cadena, cadena> en C#

Necesito convertirlo a un diccionario para los pares de valores clave mencionados anteriormente.

¿Cuál sería la mejor manera de hacerlo? Gracias.

+6

Esto es básicamente un duplicado de esta pregunta: http://stackoverflow.com/questions/776107/best-way-to-convert- query-string-to-dictionary-in-c Supongo que tendrías que reemplazar tu ';' con '&' antes de que eso funcione. –

Respuesta

5

Puede escribirlo así o recorrerlo para hacerlo usted mismo. De cualquier manera. En última instancia, se divide en ; para obtener los pares de elementos, luego en = para obtener la clave y el valor.

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

versión 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

Algo como esto?

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

Por supuesto, esto no funcionará si no se cumplen las suposiciones. Por ejemplo, un IndexOutOfRangeException podría arrojarse si el texto no está en el formato correcto y se lanzará un ArgumentException si hay claves duplicadas. Cada uno de estos escenarios requerirá diferentes modificaciones. Si puede haber espacio en blanco redundante, es posible que necesite algunas llamadas string.Trim según sea necesario.

+0

+1 para .ToDictionary - sin problemas –

11

Actualización de Ani para tener en cuenta el punto y coma al final. La cláusula where asegurará que tenga una clave y un valor antes de crear e ingresar.

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

He aquí el espacio en blanco impresionante ignorando, corrigiendo último valor de tener o no tener un poder de las expresiones regulares y coma:

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

Pero en serio, sin embargo, Ani merece apoyos para la .ToDictionary(). Nunca lo hubiera pensado.

5

Usted podría hacer esta cadena JSON utilizando, por ejemplo:

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