使用for循环在F#中向Map添加元素

Sac*_*red 0 f# loops for-loop add map

码:

let studentMap =
    for i = 0 to count do
        Map.empty.Add(students.[i].getId(), students.[i].getScores())
Run Code Online (Sandbox Code Playgroud)

我想按顺序添加到地图.我有一个数组中的学生对象,我正在尝试按顺序添加它们.我很困惑如何做到这一点.我想也许你制作一张空地图,然后按顺序通过for循环添加到它,但它总是会引起麻烦而且不起作用.有没有办法使用for循环将项添加到地图?这<key/value>对是:<string, int array>.这是我希望它格式化的方式,但它一直给我带来麻烦.我将再次重申目标以澄清:我希望能够使用for循环将项添加到地图中,我的学生对象数组用于获取我需要的相应数据.我将能够给它一个字符串并取回该学生的成绩.我知道这是一个我正在研究的奇怪问题,但我需要先尝试一些简单的事情.

pol*_*ran 7

您可以尝试更实用的惯用法:

假设你有一个类型数组Student(在下面的例子中是一个空数组):

let students = Array.empty<Student>
Run Code Online (Sandbox Code Playgroud)

您可以将数组转换为Map:

let mapStudents = students 
                    |> Array.map (fun s -> (s.getId(), s.getScore()))
                    |> Map.ofArray
Run Code Online (Sandbox Code Playgroud)


Lee*_*Lee 4

您可以使用可变映射变量:

let studentMap = 
    let mutable m <- Map.empty  
    for i = 0 to count do  
        m <- m.Add(students.[i].getId(), students.[i].getScores())
    m
Run Code Online (Sandbox Code Playgroud)

或可变字典:

let studentMap = 
    let m = new System.Collections.Generic.Dictionary<int, Scores>()  
    for i = 0 to count do  
        m.Add(students.[i].getId(), students.[i].getScores())
    m
Run Code Online (Sandbox Code Playgroud)

更实用的解决方案是使用折叠:

let studentMap = seq { 0 .. count } |> Seq.fold (fun (m: Map<int, Scores>) i -> m.Add(students.[i].getId(), students.[i].getScores())) Map.empty
Run Code Online (Sandbox Code Playgroud)