2015-06-25 13 views
6

Ho questo esempio C#, che creerà un dizionario dei numeri pari e dispari da un array di interi:Come far funzionare ToDictionary in F #?

int[] values = new int[] 
{ 
    1, 
    2, 
    3, 
    5, 
    7 
}; 

Dictionary<int, string> dictionary = 
      values.ToDictionary(key => key, val => (val % 2 == 1) ? "Odd" : "Even"); 

// Display all keys and values. 
foreach (KeyValuePair<int, string> pair in dictionary) 
{ 
    Console.WriteLine(pair); 
} 

uscita è:

[1, Odd] 
[2, Even] 
[3, Odd] 
[5, Odd] 
[7, Odd] 

voglio farlo in modo simile in F # utilizzando ToDictionary, e hanno questo finora:

let values = [| 1; 2; 3; 5; 7 |] 

let dictionary = values.ToDictionary(???) 

// Display all keys and values. 
for d in dictionary do 
    printfn "%d %s" d.Key d.Value 

Ma come faccio a scrivere la logica interna ToDictionary?

+0

@Jim Garrison: Ho provato con la risposta di Daniel, e ha funzionato. – brinch

risposta

4

Ti piace questa:

ToDictionary(id, fun v -> if v % 2 = 1 then "Odd" else "Even") 
+0

Grazie! Quindi il primo parametro deve essere chiamato "id" allora? – brinch

+2

No. 'id' è una funzione built-in che è equivalente a' fun x -> x'. Vedere i [documenti su MSDN] (https://msdn.microsoft.com/en-us/library/ee353607.aspx). – Daniel

+1

Funziona se uso "id" come primo parametro. Ma se sostituisco il tuo "id" con "fun key -> key" l'output non è più corretto. – brinch

11

Si può certamente utilizzare ToDictionary (e tutti gli altri metodi di LINQ) da F #, ma a volte è più idiomatica utilizzare le funzioni dalla libreria F #.

Se vanted per creare questo dizionario, mi piacerebbe usare qualcosa di simile:

let values = [| 1; 2; 3; 5; 7 |] 
let dictionary = dict [ for v in values -> v, if v % 2 = 1 then "Odd" else "Even" ] 

Qui dict è una funzione # libreria F che crea un dizionario da tuple contenenti chiavi e valori (viene creata la tupla usando , e quindi usiamo v come chiave e una stringa come valore).

+2

Per usare' dict' bisogna aggiungere 'apri ExtraTopLevelOperators'. Anche in questo caso il dizionario sarà immutabile 'IDictionary ': 'Aggiungi()', 'Rimuovi()' ecc. Genererà un'eccezione. – Petr

+0

Per ottenere 'Dictionary' invece di' IDictionary' è possibile utilizzare il costruttore 'Dictionary', ad esempio:' nuovo dizionario (dizionario) ' – burzhuy

Problemi correlati