F#迭代字典

时间:2010-07-16 17:55:36

标签: f#

我刚开始使用F#,我想迭代字典,获取键和值。

所以在C#中,我会说:

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

我似乎找不到在F#中做到这一点的方法(不管怎样编译)。

有人可以建议F#中的等效代码吗?

干杯,

粉碎

3 个答案:

答案 0 :(得分:19)

你的字典是什么类型的?

如果您的代码段显示为非通用IDictionary,请尝试以下操作(在F#中,for不会隐式插入转化,因此您需要添加Seq.cast<>获得一个可以轻松使用的打字集合:

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

如果您使用通用IDictionary<'K, 'V>,那么您不需要调用Seq.cast(如果您对库有任何控制权,这比之前的选项更好):

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

如果您使用的是不可变的F#Map<'K, 'V>类型(如果您在F#中编写功能代码,这是最好的类型),那么您可以使用Pavel的解决方案,或者您可以使用{{1} }循环与for活动模式一起循环:

KeyValue

在这两种情况下,您都可以使用for KeyValue(k, v) in dict do // 'k' is the key, 'v' is the value 或各种for功能。如果你需要执行带有副作用的东西,那么我宁愿iter循环(这不是我提到的第一个答案:-)),因为这是为此目的而设计的语言结构。对于功能处理,您可以使用各种功能,如for等。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

如果你正在处理Map<K,V>另一种方法是通过list<K*V>将地图转换为F#Map.toList yourMap,然后通过它迭代(甚至递归)。