Loops 使用for循环在F#中向映射添加元素

Loops 使用for循环在F#中向映射添加元素,loops,for-loop,map,f#,add,Loops,For Loop,Map,F#,Add,代码: 我正在尝试按顺序添加到地图。我有一个数组中的student对象,正在尝试按顺序添加它们。我不知道该怎么做。我想也许你可以制作一个空映射,然后通过for循环按顺序添加到它,但它总是会带来麻烦,而且不会起作用。有没有一种方法可以使用for循环将项目添加到地图中?对是这样的:。这是我想要的格式化方式,但它总是给我带来麻烦。我将再次重申这一目标以澄清:我希望能够使用for循环将项目添加到地图中,并使用student objects数组获取所需的适当数据。我将能够给它一个字符串,并获得该学生的成

代码:



我正在尝试按顺序添加到地图。我有一个数组中的student对象,正在尝试按顺序添加它们。我不知道该怎么做。我想也许你可以制作一个空映射,然后通过for循环按顺序添加到它,但它总是会带来麻烦,而且不会起作用。有没有一种方法可以使用for循环将项目添加到地图中?
对是这样的:
。这是我想要的格式化方式,但它总是给我带来麻烦。我将再次重申这一目标以澄清:我希望能够使用for循环将项目添加到地图中,并使用student objects数组获取所需的适当数据。我将能够给它一个字符串,并获得该学生的成绩,例如。我知道这是一个奇怪的问题,但我需要先尝试一些简单的方法。

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

let studentMap =
    for i = 0 to count do
        Map.empty.Add(students.[i].getId(), students.[i].getScores())
let studentMap=
让可变m.Add(students[i].getId(),students[i].getScores())Map.empty

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

let studentMap =
    for i = 0 to count do
        Map.empty.Add(students.[i].getId(), students.[i].getScores())
let studentMap=
让可变m.Add(students[i].getId(),students[i].getScores())Map.empty

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

假设您有一个类型为
Student
(以下示例中为空数组)的数组:


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

假设您有一个类型为
Student
(以下示例中为空数组)的数组:


我认为Map.ofArray方法可能是最好的,但值得指出的是for循环可以做得更好一些:

let mapStudents = students 
                    |> Array.map (fun s -> (s.getId(), s.getScore()))
                    |> Map.ofArray
let map=new System.Collections.Generic.Dictionary()
为学生在做什么
map.Add(student.getId(),student.getScore())

这巧妙地避免了数组边界错误。

我认为Map.ofArray方法可能是最好的,但值得指出的是for循环可以做得更好一些:

let mapStudents = students 
                    |> Array.map (fun s -> (s.getId(), s.getScore()))
                    |> Map.ofArray
let map=new System.Collections.Generic.Dictionary()
为学生在做什么
map.Add(student.getId(),student.getScore())

这巧妙地避免了数组边界错误。

在函数式语言中,内置数据结构是不可变的,也就是说,添加元素时,将返回数据结构的新值

如果要将一种结构转换为另一种结构,通常可以使用内置函数之一,如
Map.ofArray
。如果您有一个更复杂的场景,比如生成值的函数,那么您可以使用一个“循环”,循环的每次迭代都会返回数据结构的一个新值。用函数的方式表示这种“循环”的方法是使用一个递归函数:

let map = new System.Collections.Generic.Dictionary<int, Scores>()
for student in students do
   map.Add(student.getId(), student.getScore())

现在,您可以灵活地生成值(它们不必是数组的一部分),并且可以避免函数式编程中不惯用的可变变量。理想情况下,与本例类似,函数应该允许尾部调用优化(并避免大输入的堆栈溢出)。

在函数语言中,内置数据结构是不可变的,也就是说,当添加元素时,返回数据结构的新值

如果要将一种结构转换为另一种结构,通常可以使用内置函数之一,如
Map.ofArray
。如果您有一个更复杂的场景,比如生成值的函数,那么您可以使用一个“循环”,循环的每次迭代都会返回数据结构的一个新值。用函数的方式表示这种“循环”的方法是使用一个递归函数:

let map = new System.Collections.Generic.Dictionary<int, Scores>()
for student in students do
   map.Add(student.getId(), student.getScore())

现在,您可以灵活地生成值(它们不必是数组的一部分),并且可以避免函数式编程中不惯用的可变变量。理想情况下,就像在这种情况下,函数应该允许尾部调用优化(并避免大输入的堆栈溢出).

是的,我不知道为什么我没有使用可变lol。虽然在第二部分中我不得不使用let-mutable m=Map.empty。是的,我不知道为什么我没有使用可变lol。虽然在第二部分中我不得不使用let-mutable m=Map.empty。似乎它仍然给我带来了问题,但无论如何,我将更多地研究函数式编程,这样我就可以开始更多地理解这一点。但我会保存它,并尝试让它工作。你有什么问题?似乎它仍然给我带来了问题,但无论如何,我会对函数式编程进行更多的研究,以便我能开始更多地理解这一点。但是我会保存它并尝试让它工作。你有什么问题?这有一个问题,
Map
是不可变的。您需要重新分配从
Add
返回的变量。我已经添加了映射的类,以澄清此问题,即
map
是不可变的。您需要重新分配从
Add
返回的变量,我已经添加了映射的类来澄清
let map = new System.Collections.Generic.Dictionary<int, Scores>()
for student in students do
   map.Add(student.getId(), student.getScore())
let studentMap =
    let rec loop currentMap i =
        if i >= count then currentMap
        else
            let newMap = Map.add (students.[i].getId()) (students.[i].getScores()) currentMap
            loop newMap (i+1)
    loop Map.empty 0