2010-07-16 28 views
8

Ben sadece F # ile başlıyorum ve ben bir sözlük üzerinde yineleme, anahtarları ve değerleri almak istiyorum. F # bir sözlükte yineleme

Yani C#, ben koyardım:

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

ben (değil bir zaten derler) F # bunu yapmanın bir yolunu bulmak gibi olamaz.

Lütfen herhangi bir eşdeğer kodu F # olarak önerebilir misiniz?

Alkış,

Crush

cevap

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

Meraklı - printfn yerine dizinin sonunda bir \ n ile printfn için herhangi bir sebep var mı? –

+0

printfn'yi gördüğümde karşıt soruyu soruyorum. Sebebi yok, sadece kişisel tercih. –

18

senin sözlüğün türü nedir?

o, o zaman deneyin önerir kod pasajı olarak IDictionary olmayan jenerik ise aşağıda listelenmiştir (kolayca çalışabilirsiniz bir daktilo koleksiyonu almak için Seq.cast<> eklemem gerekiyor böylece F # yılında for örtük, dönüşümleri eklemez):

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

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

Eğer kütüphaneye üzerinde herhangi bir kontrol varsa o zaman (Seq.cast çağrısını gerekmez jenerik IDictionary<'K, 'V> kullanıyorsanız, bu) önceki seçeneğe daha iyidir 0

Eğer immutable F # Map<'K, 'V> tipini kullanıyorsanız (F # içinde fonksiyonel kod yazıyorsanız kullanacağınız en iyi yöntem hangisidir) o zaman çözümü Pavel ile kullanabilirsiniz veya for döngü ile birlikte KeyValue aktif modelini kullanabilirsiniz. Bu: her iki durumda

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

, ya for veya çeşitli iter işlevlerini kullanabilirsiniz. Yan etkileri olan bir şey yapman gerekiyorsa, o zaman for döngüsünü tercih ederim (ve bu, bu :-) den bahsettiğim ilk cevap değildir), çünkü bu, bu amaç için tasarlanmış bir dil yapısıdır. Fonksiyonel işleme için Seq.filter vb. Gibi çeşitli işlevleri kullanabilirsiniz.

+0

Yan etkilere sahip yöntemler * (işlev?) * Için döngü içeren iyi bir çağrı. – ChaosPandion

+3

Ama iter'in tüm noktası, yan etkileri de (türünün kanıtladığı gibi) yapmaktır, bu yüzden "bu amaç için tasarlandı" ... (ki bu "için" inferior olduğu anlamına gelmez, Tabii ki, aslında, 'KeyValue' hakkında bilmiyordum. –

+0

@Pavel: Evet, 'iter' de bu amaç için tasarlanmıştır. Bununla birlikte, benim izlenimim, 'iter'in OCaml'dan miras alınıp, bunu yapmanın F # yönteminin' for 'kullanmak olduğu (bu muhtemelen bir kişisel tercih olsa da). Genel olarak, dil yapısının uygun olduğu bir şey yapıyorsanız, dil yapılarının kütüphane işlevlerine göre tercih edildiğini düşünüyorum. –