2010-07-16 15 views
8

Estoy empezando con F # y quiero iterar sobre un diccionario, obteniendo las claves y los valores.F # iteración sobre un diccionario

Así que en C#, que había puesto:

IDictionary resultSet = test.GetResults; 
foreach (DictionaryEntry de in resultSet) 
{ 
    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); 
} 

Me parece que no puede encontrar una manera de hacer esto en C# (no uno que compila todos modos).

¿Alguien podría sugerir el código equivalente en F #?

Saludos,

Crush

Respuesta

2
resultSet |> Map.iter (fun key value -> 
    printf "Key = %A, Value = %A\n" key value) 
+0

Curiosidad: ¿Hay alguna razón para imprimir con \ n al final de la cadena en lugar de solo printfn? –

+0

Hago la pregunta opuesta cada vez que veo 'printfn'. No hay razón, por supuesto, solo preferencia personal. –

18

¿Cuál es el tipo de su diccionario?

Si es no genérico IDictionary como el fragmento de código indica, a continuación, intente lo siguiente (en F #, for no se inserta de manera implícita las conversiones, por lo que es necesario agregar Seq.cast<> para conseguir una colección mecanografiado que se puede trabajar fácilmente con):

for entry in dict |> Seq.cast<DictionaryEntry> do 
    // use 'entry.Value' and 'entry.Key' here 

Si está utilizando genérica IDictionary<'K, 'V> entonces no es necesario el llamado a Seq.cast (si tiene ningún control sobre la biblioteca, esto es mejor que la opción anterior):

for entry in dict do 
    // use 'entry.Value' and 'entry.Key' here 

Si está utilizando el tipo de F # Map<'K, 'V> inmutable (que es el mejor tipo para usar si está escribiendo código funcional en F #) entonces puede usar la solución de Pavel o puede usar el loop junto con el patrón activo KeyValue esto:

for KeyValue(k, v) in dict do 
    // 'k' is the key, 'v' is the value 

En los dos casos, se puede utilizar cualquiera de for o varias funciones iter. Si necesita realizar algo con efectos secundarios, entonces preferiría for loop (y esta no es la primera respuesta donde menciono esto :-)), porque esta es una construcción de lenguaje diseñada para este propósito. Para el procesamiento funcional, puede usar varias funciones como Seq.filter, etc.

+0

Buena llamada con el ciclo de métodos * (¿función?) * Con efectos secundarios. – ChaosPandion

+3

Pero el objetivo de 'iter' es realizar también efectos secundarios (como lo demuestra su tipo), por lo que también está" diseñado para este propósito "... (lo que no significa que' for' sea inferior, por supuesto, de hecho, simplemente no sabía sobre 'KeyValue'). –

+0

@Pavel: Sí, 'iter' también está diseñado para este propósito. Sin embargo, mi impresión es que 'iter' se hereda de OCaml y la forma F # de hacer esto es usar' for' (aunque probablemente sea una preferencia personal). En general, creo que los constructos del lenguaje son preferibles a las funciones de la biblioteca si estás haciendo algo donde la construcción del lenguaje es adecuada. –

Cuestiones relacionadas