Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 为什么F的惯用字典集合(Map)需要K类型来实现comparable,而C的字典不需要?_Dictionary_F#_Hashtable_C# To F# - Fatal编程技术网

Dictionary 为什么F的惯用字典集合(Map)需要K类型来实现comparable,而C的字典不需要?

Dictionary 为什么F的惯用字典集合(Map)需要K类型来实现comparable,而C的字典不需要?,dictionary,f#,hashtable,c#-to-f#,Dictionary,F#,Hashtable,C# To F#,我知道这个问题与我不久前问的这个问题非常相似: 但是,我想确认一下,对于这个案例,给出的理由是否相同?我想知道是否有人在F中实现了一个不可变的映射,它是由某人编写的,不那么严格,也不要求K具有可比性?我很乐意使用它,因为我不太在乎性能 为什么F的惯用词典集合映射需要K类型 实现comparable而C的字典没有 F Map要求键具有可比性,因为Map是可比的,您必须根据比较结果决定要去哪个子树。C字典实现为一个链表桶。通过密钥的哈希代码得到一个bucket,然后迭代列表,直到找不到相等的密钥为止

我知道这个问题与我不久前问的这个问题非常相似:

但是,我想确认一下,对于这个案例,给出的理由是否相同?我想知道是否有人在F中实现了一个不可变的映射,它是由某人编写的,不那么严格,也不要求K具有可比性?我很乐意使用它,因为我不太在乎性能

为什么F的惯用词典集合映射需要K类型 实现comparable而C的字典没有

F Map要求键具有可比性,因为Map是可比的,您必须根据比较结果决定要去哪个子树。C字典实现为一个链表桶。通过密钥的哈希代码得到一个bucket,然后迭代列表,直到找不到相等的密钥为止。在这两种数据结构中,对键进行了比较。唯一的区别是,对于字典等式比较就足够了

所以,问题是为什么F映射有显式比较约束,而C字典有隐式等式要求

让我们从C开始。如果字典有一个IEquatable键约束,会怎么样?那么,您必须为用作字典键的每个自定义数据类型手动实现此接口。但是如果你想要不同的平等实现呢?例如,在某些词典中,您希望密钥字符串不区分大小写。当然,您可以将用于键比较的IEqualityComparer实现传递给字典,而且在需要比较的任何地方都可以。但若要使用外部比较器,为什么要强制密钥具有可比性呢?请注意,如果不向字典传递任何内容,则始终会使用默认比较器。默认比较器检查键是否实现IComparable并使用该实现

那么为什么F对关键数据类型有明确的可比较约束呢?因为此约束不会强制您为用作映射键的每个自定义数据类型手动实现IComparable。C和F类型系统之间的一大区别是,默认情况下,F类型具有可比性和可均衡性。F编译器生成IComparable、IComparable和IStructuralComparable实现,除非您显式地用NoComparison属性标记类型。因此,当您使用F数据类型时,此约束不会强制您编写任何附加代码


使用比较/相等约束的另一个好处是-F对实现比较或相等=、System.Collections.Immutable.ImmutableDictionary的类型有许多预定义的泛型操作,没有键约束只是一个快速nit,NET字典类型实际上是一组数组,而不是链表:是和否:这是一个存储在数组中的链表,用于优化-检查条目结构-它有next,next是下一项的索引