2010-05-12 14 views
8

Tengo una matriz de tipo cadena que se ve así: "test1|True,test2|False,test3|False,test4|True". Esto es esencialmente una matriz 2d como [test1] [True] [test2] [False] [test3] [False] [test4] [True].Cómo convertir una matriz de 2 d en un objeto de diccionario

Quiero convertir esto en un dictionary<string,bool> usando LINQ, algo así como:

Dictionary<string, bool> myResults = results.Split(",".ToCharArray).ToDictionary() 

alguna idea?

+0

No hay tal cosa como una matriz de tipo cadena. Creo que te refieres a una matriz codificada en una cadena. –

+0

lo siento, sí, es una cadena que quiero convertir en una matriz 2d sobre la marcha dentro de la sentencia linq y convertirla en un objeto de diccionario – Webcognoscere

+0

Las respuestas a esta pregunta solo demuestran cuántas maneras diferentes hay de hacer las cosas. La respuesta de todos hasta ahora es ligeramente diferente, pero todo es válido. Mi voto va para [Marcelo] (http://stackoverflow.com/questions/2817367/how-to-convert-a-2-d-array-into-a-dictionary-object/2817419#2817419), como creo es el más elegante –

Respuesta

5

Primera vuelta a su cadena en una matriz adecuada:

String sData = "test1|True,test2|False,test3|False,test4|True"; 
String[] sDataArray = sData.Split(','); 

Entonces se puede procesar la String[] en un diccionario:

var sDict = sDataArray.ToDictionary(
     sKey => sKey.Split('|')[0], 
     sElement => bool.Parse(sElement.Split('|')[1]) 
    ); 

El método ToDictionary toma 2 funciones que extraen los datos de clave y elemento de cada elemento de matriz de origen.

Aquí, he extraído cada mitad dividiendo en "|" y luego usé la primera mitad como la clave y la segunda que analicé en un bool para usar como elemento.

Obviamente, esto no contiene ninguna comprobación de errores, por lo que podría fallar si la cadena de origen no estuviera separada por comas, o si cada elemento no estuviera separado por tuberías. Así que ten cuidado con el origen de tu cadena fuente. Si no coincide exactamente con este patrón, va a fallar, por lo que deberá realizar algunas pruebas y validación.

Marcelo's respuesta es similar, pero creo que es un poco más elegante.

+0

Gracias Simon, gracias por explicarlo. – Webcognoscere

8
var d = results.Split(',') 
       .Select(row => row.Split('|')) 
       .ToDictionary(srow => srow[0], srow => bool.Parse(srow[1])); 
+0

Brillante, gracias mil dude – Webcognoscere

-1

Algo como esto debería funcionar:

var fullString = "Test,True|Test2,False"; 

var query = from item in fullString.Split('|') 
      let splitted = item.Split(',') 
      let value = bool.Parse(splitted[1]) 
      select new { Key = splitted[0], Value = value }; 

var dict = query.ToDictionary(pair => pair.Key, pair => pair.Value); 
-1

usted podría intentar algo como esto:

var resultsArray = results.Split(','); 

var myResults = new Dictionary<string, bool>(); 

foreach (var str in resultsArray) 
{ 
    var parts = str.Split('|'); 
    myResults.Add(parts[0], bool.Parse(parts[1])); 
} 
Cuestiones relacionadas