代码之家  ›  专栏  ›  技术社区  ›  Bakudan Lovely

使用Map.pick在地图中查找元素

f#
  •  3
  • Bakudan Lovely  · 技术社区  · 6 年前

    let idx = 9
    let map = 
        Map.empty.
            Add(10, "abc").
            Add( 9, "bcd").
            Add( 8, "cde").
            Add( 7, "def")
    let result = 
        map 
        |> Map.pick (fun key value -> if idx > key then Some(key) else None)
    printfn "%A" result
    

    Map.pick 来自MSDN: Searches the map looking for the first element where the given function returns a Some value.

    我假设搜索从地图的末尾开始-从7到10,因为结果是7。

    1 回复  |  直到 6 年前
        1
  •  4
  •   TheQuickBrownFox    6 年前

    由于数据结构的设计方式,地图按其键的顺序存储。映射函数,如 pick 碰巧从最小的钥匙开始,但这不是你应该依赖的东西。

    如果这是您使用此映射的主要方式,那么映射可能不是您整个任务的最佳数据结构选择。但如果你真的需要使用地图,我建议你:

    map 
    |> Map.toSeq
    |> Seq.filter (fun (key, _) -> idx > key)
    |> Seq.map fst
    |> Seq.max
    // returns 8
    

    请注意,如果没有符合条件的密钥,则 Seq.max 将接收并清空序列并引发异常。