繁体   English   中英

我可以通过F#中的键插入地图吗?

[英]Can I insert into a map by key in F#?

我用F#搞砸了一下,我不太确定我是否正确地这样做了。 在C#中,这可以使用IDictionary或类似的东西来完成。

type School() =
   member val Roster = Map.empty with get, set

   member this.add(grade: int, studentName: string) =
      match this.Roster.ContainsKey(grade) with
        | true -> // Can I do something like this.Roster.[grade].Insert([studentName])?
        | false -> this.Roster <- this.Roster.Add(grade, [studentName])

有没有办法插入地图,如果它包含指定的键或在这种情况下我只是使用错误的集合?

F# Map类型是从键到值的映射,就像普通的.NET Dictionary ,除了它是不可变的。

如果我正确理解你的目标,那么你就是要为每个年级保留一份学生名单。 在这种情况下,类型是从整数到名称列表的Map<int, string list> ,即Map<int, string list>

实际上,地图上的Add操作要么添加要么替换元素,所以我认为这是在false情况下所需的操作。 true情况下,您需要获取当前列表,附加新学生,然后替换现有记录。 一种方法是写下这样的东西:

type School() =
   member val Roster = Map.empty with get, set

   member this.Add(grade: int, studentName: string) =
     // Try to get the current list of students for a given 'grade'
     let studentsOpt = this.Roster.TryFind(grade) 
     // If the result was 'None', then use empty list as the default 
     let students = defaultArg studentsOpt []
     // Create a new list with the new student at the front
     let newStudents = studentName::students
     // Create & save map with new/replaced mapping for 'grade'
     this.Roster <- this.Roster.Add(grade, newStudents)

这不是线程安全的(因为并发调用Add可能无法正确更新映射)。 但是,您可以随时访问school.Roster ,安全地迭代它(或共享它的引用),因为它是一个不可变的结构。 但是,如果您不关心这一点,那么使用标准Dictionary也会非常好 - 取决于您的实际用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM