【问题标题】:Does F# provide any map/dictionary that's not ordered?F# 是否提供任何未排序的地图/字典?
【发布时间】:2019-04-18 21:52:24
【问题描述】:

我观察到 F# 的 Map 总是根据其键排序。 F# 是否提供任何替代有序字典的方法?

在使用 C# 字典作为替代方案之前,我想问一下。

【问题讨论】:

  • 你为什么想要一张未排序的地图?它是否被订购通常不应该对您的代码产生任何影响 - 如果您使用地图,通常是因为您想要一种将值与键关联的方式 - 为此,实现并不重要(除了复杂性)。
  • @TomasPetricek 差异确实会影响代码,而复杂性是选择一种类型而不是另一种类型的重要原因。这就是为什么有这么多关于 Dictionary vs SortedDictionary O(1)O(log(n)) 的问题询问当您不关心订单时,访问是一个重要的区别
  • @TomasPetricek if that answer still holds then map 比 Dictionary 慢 5-40 倍。这在 Web 服务等高吞吐量应用程序中存在巨大差异,在这些应用程序中,此类延迟会转化为相同负载所需的服务器
  • @PanagiotisKanavos - PersistentHashMap 的实现方式可能比 F# 的默认 Map 实现更快,尽管我不知道有任何基准测试。但是,在您看到基准之前,不要假设 F# 的 Map 慢 5-40 倍的数字适用于 PersistentHashMap;实现方式完全不同。
  • @PanagiotisKanavos 当然,不可变映射比可变哈希表慢,这是在某些情况下使用它的一个很好的理由,但这并不能回答我的问题。我的问题是,为什么 OP 想要一张未排序的地图?

标签: f#


【解决方案1】:

FSharpx.Collections 有 PersistentHashMap,它没有排序。

【讨论】:

  • 为什么用字典代替字典?
  • @PanagiotisKanavos - 因为它的持久属性,这与 F# 的 Map 实现相同:添加或删除项目会创建一个新集合,而不是修改现有集合。 Dictionary<> 可能更快,但它的可变特性使其容易出现不可变集合避免的错误。所以除非你真的知道你需要那个速度,否则大多数时候使用Dictionary<>而不是持久化集合是过早优化的情况。
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 2021-09-03
  • 2016-05-06
  • 2012-10-19
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
相关资源
最近更新 更多