2012-07-13 16 views
7

Tengo un Dictionary<string,int> dictionary1 y necesito convertirlo en un List<Data> donde Data tiene las propiedades lable = dictionary1.key y value = dictionary1.value. No quiero usar un ciclo for/foreach (escrito por mí mismo) porque para evitarlo estoy intentando usar un Dictionary.'Convertir' Diccionario <string,int> en la Lista <object>

Otra opción sería tener dos diccionarios diferentes (diccionario2 y diccionario3) donde dictionary2<string,keyOfDictionary1> y dictionary3<string,valueOfDictionary1>.

¿Tengo sentido? ¿Es eso posible? ¿Hay alguna opción mejor?

+6

"no quiero usar un bucle" va a ser difícil. Vas a tener _para iterar el diccionario _somehow_. –

+2

Obtendrá una gran cantidad de respuestas 'LINQ'; solo tenga en cuenta que la biblioteca' LINQ' todavía ejecuta esencialmente un 'foreach' para devolver un resultado. – Oded

+0

¿cómo crees que funciona linq? – Jodrell

Respuesta

12

Suponiendo:

class Data 
{ 
    public string Label { get; set; } 

    public int Value { get; set; } 
} 

continuación:

Dictionary<string, int> dic; 
List<Data> list = dic.Select(p => new Data { Label = p.Key, Value = p.Value }).ToList(); 
5

¿Quizás podría usar LINQ?

dictionary1.Select(p => new Data(p.Key, p.Value)).ToList() 

Esto es sin embargo con yield y por lo tanto los bucles en el fondo ...

+2

esto requeriría 'Datos' para tener un constructor que toma los valores como parámetros, que no se especifica en la pregunta. –

+0

@ ErenErsönmez Sí, pero es una cuestión trivial realizar la inicialización en línea si eso es lo que necesita. ¡Estoy señalando una técnica en lugar de una solución lista para copiar y pegar! – Leonard

4
myDictionary.Select(x => new Data(){ label = x.Key, value = x.Value).ToList(); 
0
public class Data 
    { 
     public string Key { get; set; } 

     public int Value { get; set; } 
    } 

    private static void Main(string[] args) 
    { 
     Dictionary<string, int> dictionary1 = new Dictionary<string, int>(); 
     dictionary1.Add("key1", 1); 
     dictionary1.Add("key2", 2); 

     List<Data> data = dictionary1.Select(z => new Data { Key = z.Key, Value = z.Value }).ToList(); 

     Console.ReadLine(); 
    } 
1

Trate

dictionary1.Select(p => new Data(p.Key, p.Value)).ToList(); 
2

que asumen que "ningún bucle" en realidad significa "quiero LINQ":

List<Data> = dictionary1.Select(
    pair => new Data() { 
     label = pair.Key, 
     value = pair.Value 
    })).ToList(); 
1

.NET ya tiene un tipo de datos que hace lo haría Data: KeyValuePair<T1,T2>. El diccionario ya implementa IEnumerable<KeyValuePair<T1,T2>>, simplemente echelo.

Dictionary<string, int> blah = new Dictionary<string, int>(); 
IEnumerable<KeyValuePair<string, int>> foo = blah; 
+0

Brillantemente simple. Sin entender las necesidades del OP, no podemos saber si realmente no es necesario que sea más complicado que esto. :) –

+0

Acepto que no cumplirá con las necesidades si 'Key' * absolutely * debe renombrarse como' Label'. Pero esta es la única forma de evitar el bucle de AFAIK. Sin embargo, incluso el elenco no tiene sentido. OP podría simplemente usar el diccionario en cualquier lugar que necesitaran un IEnumerable. –

+0

Desafortunadamente necesitaba cambiar el nombre de mis datos a Label. Intenté hacer esto, pero tendría lo mismo que dijiste. Así que, muchas gracias por la ayuda y lamento haber generado malentendidos al decir que no quería escribir un bucle for/foreach porque sabía que las funciones integradas lo harían mejor para mí. manera (incluso si fuera necesario un ciclo en el fondo). – Jenninha

1

Este es un post viejo, pero puestos de trabajo sólo para ayudar a otras personas;)

ejemplo, para convertir cualquier tipo de objeto:

public List<T> Select<T>(string filterParam) 
{  
    DataTable dataTable = new DataTable() 

    //{... implement filter to fill dataTable } 

    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>(); 
    Dictionary<string, object> row; 

    foreach (DataRow dr in dataTable.Rows) 
    { 
     row = new Dictionary<string, object>(); 
     foreach (DataColumn col in dataTable.Columns) 
     { 
      row.Add(col.ColumnName, dr[col]); 
     } 
     rows.Add(row); 
    } 

    string json = new JavaScriptSerializer().Serialize(rows); 

    using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) 
    { 
     DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T[])); 
     var tick = (T[])deserializer.ReadObject(stream); 
     return tick.ToList(); 
    } 
} 
0

Por si acaso solo ayuda a nadie, lo hice así, manejará objetos más complejos que un solo tipo de valor, como lo establece el OP.

// Assumes: Dictionary<string, MyObject> MyDictionary; 
List<MyObject> list = new List<MyObject>(); 
list.AddRange(MyDictionary.Values.ToArray()); 
Cuestiones relacionadas