F#教程:Dictionary

学习数组、List和Tuple后,这回我们要学习Dictionary。

let dictionary = dict [ (1, "Up"); (2, "Down"); (3, "Left"); (4,"Right") ]
let v = dictionary.[1]
printfn "%A" v
printfn "%A" dictionary.[4]
for e in dictionary do
         printfn "%d %s" e.Key e.Value

dict不是关键字,而是标准库中定义的函数。选择第一行代码,通过Alt+Enter就可以看到如下显示:

val dictionary : System.Collections.Generic.IDictionary<int,string>

通过使用for语句,可以逐个取出各个要素。也可以使用Key, Value属性取出值。for可以取出的值的类型是.NET的KeyValuePair。

此外我们还可以通过使用.NET Framework类的创建一个空的Dictionary:

let hist = new Dictionary<char,int>()

由于是.NET类,就可以照常使用它的方法了:

if hist.ContainsKey(c) then

或则

hist.Add(c,v+1)

这些都是OK的。但是如下代码会出现编译警报:

hist.Remove(c)

原因就是有返回值的方法需要得到处理。代码如下:

let _ = hist.Remove(c)

是不是有点严格啊?如果想忽略掉就可以和上述代码一样使用_。

当然也可以像如下一样写代码:

for KeyValue(k,v) in dictionary do
  printfn "Key=%d Value=%s" k v

时间: 2024-10-06 00:45:52

F#教程:Dictionary的相关文章

F#教程-Hello world

前言:最近在了解F#,无意中看到一个日文的教程(http://techbank.jp/Community/blogs/gushwell/default.aspx), 觉得很不错,所以希望可以和大家一起分享.学习. F#的学习过程.未解决问题以及失败的经历都会连载到本博客中. 有了Visual Studio 2010提供的环境,我们就可以开始学习F#编程了.那就开始吧!最先我们就做个Hello World应用.实现如下: printf "Hello world!" F6:编译.F5:执行

F#教程:匿名函数(Lambda)

这回我们要学习的是Lambda表达式.F#和C#一样也有匿名函数.不过感觉将匿名函数称为Lambda更好些. 试着写些代码吧: let add = fun x y -> x + y printfn "%A" (add 1 3) 这里我们定义了add函数.这个定义使用了匿名函数(取出x,y两个参数,并将x+y的结果返回).fun就是匿名函数的关键字. 之前有过的函数定义是: let add x y = x + y 这是一种省略形式.不同的只是参数是否在lambda表达式中. 从C#

F#教程:枚举类型

F#中枚举类型的定义实例如下: type Season = | Spring = 1 | Summer = 2 | Autumn = 3 | Winter = 4 使用刚定义过的枚举类型的代码如下: let s = Season.Winter if s = Season.Winter then printfn "冬" else printfn "冬以外" 不过如下代码就会编译出错: if s = "Winter" then printfn &qu

F#教程:函数

数据类型说了好几回了,有点烦了吧?这回我们就换个角度,学习下函数吧! 有两个两个输入参数并返回它们的和的简单函数如下: let Add a b = a + b 这就是函数的定义.同样使用了声明变量时的let. 确实感觉很神奇,没有了C#语言那样的冗长.看了这个定义后,有点感觉C#是冗长的语言.调用函数的代码如下: let c = Add 10 20 printfn "%d" c 其中,由于不使用括号有点怪怪的感觉.完整的程序如下: #light let Add a b = a + b

F#教程:递归

目前为止我们已经学习了if.for .while等语句,这样我们就可以尝试写一些简单的程序了. 我们就试着写一个计算从1到指定数总和的程序吧.首先定义个从键盘读取指定值作为输入参数的SumTotal函数. #light let SumTotal n = let mutable ttl = 0 for i = 1 to n do ttl <- ttl + i ttl let s = stdin.ReadLine() let num = System.Int32.Parse(s) printfn &qu

F#教程:不变性

目前为止我们还一直避免的话题就是F#中必须注意的:变量无法再被赋值. let x = 10 let y = 5 let x = x + y // Compile Error 一旦变量赋值以后,再次赋值就会出现错误. F#的变量为什么要有不变性呢? 习惯了目前一些变量是可变的过程语言和面向对象语言,可能就会有变量不可变的话是否可以很好编码的疑问. 这样也就无法写i++以及i += 2之类的增量处理. 去年稍微接触了下Haskell,尽管全部变量都是不变的,但还是可以很好地编码.F#也吸收了 Has

F#教程:while语句

F#里也有while语句.接下来我们就试着使用while语句写代码. <不变性>一文中有人评论说可以适用 ref,我们就试着使用下. while循环的作用域通过缩进表示. let num = ref 0 while !num < 10 do num := !num + 1 printfn "%d" !num ref是表示引用的关键字.把它想象成C语言的指针就好了.num是指针变量,保持了数值0的引用.取值时候使用!操作符.再赋值的时候使用:=.这点和Pascal和类似

F#教程:Tuple

tuple是可以将2个以上的数据汇总起来管理的数据类型.要是C#也有就好了. F#的tuple实例代码如下: #light let data = (1,2) printfn "%A" data printfn "%A" (fst data) printfn "%A" (snd data) fst.snd分别表示 First.Second,可以用来取出最初的两个元素.运行结果是: (1, 2) 1 2 (1,2)和1,2都是OK的,有没有()都一样

F#教程:Record

F#和C#语言一样可以定义构造体.不过F#将这称为Record. 可以试着定义如下Point类型的 Record: type Point = { x: float; y: float} 使用Point类型的代码: let pt = { x = 10.0; y = 15.0 } printfn "(%f , %f)" pt.x pt.y let一行声明 pt时候就没有指定类型,不过F#却可以知道它是Point类型.很有趣,甚至有点吃惊是不是? 如果定义值两个所有域的名称和类型都一样的Re