2015-06-25 12 views
6

mam ten przykład C#, który będzie tworzyć słownika nieparzystych i parzystych numerów z tablicy liczb całkowitych:Jak zdobyć ToDictionary do pracy w 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); 
} 

wyjścia:

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

chcę zrobić podobnie w F # przy użyciu ToDictionary i do tej pory:

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 

Ale jak mogę napisać logikę wewnątrz ToDictionary?

+0

@Jim Garrison: Próbowałem z odpowiedzią Daniela, i zadziałało. – brinch

Odpowiedz

4

Jak to:

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

Dzięki! Zatem pierwszy parametr musi być nazwany "id"? – brinch

+2

Nr "id" jest wbudowaną funkcją, która jest odpowiednikiem 'zabawy x -> x'. Zobacz [dokumenty na MSDN] (https://msdn.microsoft.com/en-us/library/ee353607.aspx). – Daniel

+1

Działa, jeśli jako pierwszy parametr używam "id". Ale jeśli zastąpię twój "id" przez "fun key -> key" dane wyjściowe nie są już poprawne. – brinch

11

Można oczywiście użyć ToDictionary (i wszystkie inne metody LINQ) z F #, ale czasami jest to bardziej idiomatyczne użycie funkcji z F # biblioteki.

Gdybym vanted do stworzenia tego słownika, chciałbym użyć czegoś takiego:

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

Tutaj dict jest funkcja # biblioteka F, który tworzy słownik z krotek zawierających klucze i wartości (krotka jest tworzony przy użyciu , i dlatego używamy v jako klucza i łańcucha jako wartości).

+2

Aby użyć' dict', musisz dodać 'open ExtraTopLevelOperators'. Również w tym przypadku słownik będzie niezmienny 'IDictionary ': 'Dodaj()', 'Usuń()' itp. Rzuci wyjątek. – Petr

+0

Aby dostać się do 'Dictionary' zamiast' IDictionary' możesz użyć 'Dictionary' constructor, przykład:' new Dictionary (słownik) ' – burzhuy

Powiązane problemy