通过查看本主题,可以确定哪种 F# 集合类型最适合特定需求。 这些集合类型不同于 .NET 中的集合类型,例如命名空间中的 System.Collections.Generic
集合类型,因为 F# 集合类型是从函数编程角度而不是面向对象的透视设计的。 更具体地说,只有数组集合具有可变元素。 因此,修改集合时,可以创建已修改集合的实例,而不是更改原始集合。
集合类型在存储对象的数据结构类型方面也有所不同。 数据结构(如哈希表、链接列表和数组)具有不同的性能特征和一组不同的可用作。
集合类型表
下表显示了 F# 集合类型。
类型 | DESCRIPTION | 相关链接 |
---|---|---|
列表 | 同一类型的有序、不可变的元素系列。 作为链接列表实现。 |
列表 列出模块 |
数组 | 连续数据元素的固定大小、从零开始的可变集合,这些元素都属于同一类型。 |
数组 数组模块 Array2D 模块 Array3D 模块 |
seq | 一系列逻辑元素,这些元素都是一种类型。 当你拥有大型有序的数据收集,但不一定期望使用所有元素时,序列特别有用。 单个序列元素仅根据需要进行计算,因此,如果不是使用所有元素,序列的性能可以优于列表。 序列由 seq<'T> 类型表示,该类型是别名 IEnumerable<T> 。 因此,任何实现的 System.Collections.Generic.IEnumerable<'T> .NET Framework 类型都可以用作序列。 |
序列 Seq 模块 |
地图 | 元素的不可变字典。 元素可通过键进行访问。 | 地图模块 |
Set | 基于二进制树的不可变集,其中比较是 F# 结构比较函数,该函数可能会对键值使用接口的实现 System.IComparable 。 |
设置模块 |
函数表
本部分比较 F# 集合类型上可用的函数。 给定函数的计算复杂性,其中 N 是第一个集合的大小,M 是第二个集合的大小(如果有)。 短划线 (-) 指示此函数在集合上不可用。 由于对序列进行延迟计算,因此函数(例如 Seq.distinct
可能是 O(1),因为它会立即返回,尽管它在枚举时仍会影响序列的性能。
功能 | 数组 | 列表 | 序列 | 地图 | 设置 | DESCRIPTION |
---|---|---|---|---|---|---|
追加 | O(N) | O(N) | O(N) | - | - | 返回一个新集合,该集合包含第一个集合的元素,后跟第二个集合的元素。 |
添加 | - | - | - | O(log(N)) | O(log(N)) | 返回添加元素的新集合。 |
平均 | O(N) | O(N) | O(N) | - | - | 返回集合中元素的平均值。 |
averageBy | O(N) | O(N) | O(N) | - | - | 返回应用于每个元素的提供的函数结果的平均值。 |
blit | O(N) | - | - | - | - | 复制数组的一部分。 |
快取 | - | - | O(N) | - | - | 计算和存储序列的元素。 |
强制转换 | - | - | O(N) | - | - | 将元素转换为指定类型。 |
choose | O(N) | O(N) | O(N) | - | - | 将给定函数 f 应用于列表的每个元素 x 。 返回包含函数返回 Some(f(x)) 的每个元素的结果的列表。 |
收集 | O(N) | O(N) | O(N) | - | - | 将给定函数应用于集合的每个元素,连接所有结果,并返回组合列表。 |
compareWith | - | - | O(N) | - | - | 使用给定的比较函数(元素 by 元素)比较两个序列。 |
concat | O(N) | O(N) | O(N) | - | - | 将给定枚举枚举合并为单个串联枚举。 |
包含 | - | - | - | - | O(log(N)) | 如果集包含指定的元素,则返回 true。 |
containsKey | - | - | - | O(log(N)) | - | 测试元素是否位于映射的域中。 |
count | - | - | - | - | O(N) | 返回集合中元素的数目。 |
countBy | - | - | O(N) | - | - | 将键生成函数应用于序列的每个元素,并返回一个序列,该序列生成唯一键及其在原始序列中的出现次数。 |
复制 | O(N) | - | O(N) | - | - | 复制集合。 |
创建 | O(N) | - | - | - | - | 创建所有最初都是给定值的整个元素的数组。 |
延迟 | - | - | O(1) | - | - | 返回从序列的给定延迟规范生成的序列。 |
差异 | - | - | - | - | O(M*log(N)) | 返回一个新集,其中包含从第一组中删除的第二组的元素。 |
distinct | O(1)* | 返回一个序列,该序列根据条目的泛型哈希和相等比较,不包含重复项。 如果序列中多次发生元素,则会放弃以后出现的事件。 | ||||
distinctBy | O(1)* | 根据给定键生成函数返回的键的泛型哈希和相等性比较,返回不包含重复条目的序列。 如果序列中多次发生元素,则会放弃以后出现的事件。 | ||||
空 | O(1) | O(1) | O(1) | O(1) | O(1) | 创建一个空集合。 |
存在 | O(N) | O(N) | O(N) | O(log(N)) | O(log(N)) | 测试序列的任何元素是否满足给定谓词。 |
exists2 | O(min(N,M)) | - | O(min(N,M)) | 测试输入序列的任何对应元素对是否满足给定谓词。 | ||
填充 | O(N) | 将数组的元素范围设置为给定值。 | ||||
筛选器 | O(N) | O(N) | O(N) | O(N) | O(N) | 返回一个新集合,该集合仅包含给定谓词返回 true 的集合的元素。 |
find | O(N) | O(N) | O(N) | O(log(N)) | - | 返回给定函数返回 true 的第一个元素。 如果不存在此类元素,则返回 System.Collections.Generic.KeyNotFoundException 。 |
findIndex | O(N) | O(N) | O(N) | - | - | 返回数组中满足给定谓词的第一个元素的索引。
System.Collections.Generic.KeyNotFoundException 如果没有元素满足谓词,则引发。 |
findKey | - | - | - | O(log(N)) | - | 计算集合中每个映射上的函数,并返回函数返回 true 的第一个映射的键。 如果不存在此类元素,此函数将 System.Collections.Generic.KeyNotFoundException 引发 。 |
折叠 | O(N) | O(N) | O(N) | O(N) | O(N) | 将函数应用于集合的每个元素,通过计算线程化累加器参数。 如果输入函数为 f 且元素为 i0...iN,此函数计算 f (...(f s i0)...)在。 |
fold2 | O(N) | O(N) | - | - | - | 将函数应用于两个集合的相应元素,通过计算对累加器参数进行线程处理。 集合的大小必须相同。 如果输入函数为 f 且元素为 i0...iN 和 j0...jN,此函数计算 f (...(f s i0 j0)...)iN jN。 |
foldBack | O(N) | O(N) | - | O(N) | O(N) | 将函数应用于集合的每个元素,通过计算线程化累加器参数。 如果输入函数为 f 且元素为 i0...iN,此函数计算 f i0 (...(f iN s) 。 |
foldBack2 | O(N) | O(N) | - | - | - | 将函数应用于两个集合的相应元素,通过计算对累加器参数进行线程处理。 集合的大小必须相同。 如果输入函数为 f 且元素为 i0...iN 和 j0...jN,此函数计算 f i0 j0 (...(f iN jN s))。 |
forall | O(N) | O(N) | O(N) | O(N) | O(N) | 测试集合的所有元素是否满足给定谓词。 |
forall2 | O(N) | O(N) | O(N) | - | - | 测试集合的所有相应元素是否满足给定谓词成对。 |
get / nth | O(1) | O(N) | O(N) | - | - | 从集合中返回给定其索引的元素。 |
头 | - | O(1) | O(1) | - | - | 返回集合的第一个元素。 |
初始化 | O(N) | O(N) | O(1) | - | - | 为维度和生成器函数创建一个集合来计算元素。 |
initInfinite | - | - | O(1) | - | - | 生成一个序列,该序列在迭代时通过调用给定函数返回连续元素。 |
相交 | - | - | - | - | O(log(N)*log(M)) | 计算两组的交集。 |
intersectMany | - | - | - | - | O(N1*N2...) | 计算集序列的交集。 序列不得为空。 |
isEmpty | O(1) | O(1) | O(1) | O(1) | - | 如果集合为空,则返回 true 。 |
isProperSubset | - | - | - | - | O(M*log(N)) | 如果 true 第一组的所有元素都位于第二个集中,并且第二组的至少一个元素不在第一个集中,则返回。 |
isProperSuperset | - | - | - | - | O(M*log(N)) | 如果第二组的所有元素都位于第一个集中,并且第一组的至少一个元素不在第二个集中,则返回 true 。 |
isSubset | - | - | - | - | O(M*log(N)) | 返回 true 第一组的所有元素是否位于第二个集中。 |
isSuperset | - | - | - | - | O(M*log(N)) | 返回 true 第二组的所有元素是否位于第一个集中。 |
iter | O(N) | O(N) | O(N) | O(N) | O(N) | 将给定函数应用于集合的每个元素。 |
iteri | O(N) | O(N) | O(N) | - | - | 将给定函数应用于集合的每个元素。 传递给函数的整数指示元素的索引。 |
iteri2 | O(N) | O(N) | - | - | - | 将给定函数应用于从两个数组中的匹配索引绘制的一对元素。 传递给函数的整数指示元素的索引。 这两个数组的长度必须相同。 |
iter2 | O(N) | O(N) | O(N) | - | - | 将给定函数应用于从两个数组中的匹配索引绘制的一对元素。 这两个数组的长度必须相同。 |
last | O(1) | O(N) | O(N) | - | - | 返回适用集合中的最后一项。 |
length | O(1) | O(N) | O(N) | - | - | 返回集合中的元素数。 |
映射 | O(N) | O(N) | O(1) | - | - | 生成一个集合,该集合的元素是将给定函数应用于数组的每个元素的结果。 |
map2 | O(N) | O(N) | O(1) | - | - | 生成一个集合,其元素是将给定函数应用于两个集合的对应元素的结果。 两个输入数组的长度必须相同。 |
map3 | - | O(N) | - | - | - | 生成一个集合,该集合的元素是同时将给定函数应用于三个集合的相应元素的结果。 |
mapi | O(N) | O(N) | O(N) | - | - | 生成一个数组,其元素是将给定函数应用于数组的每个元素的结果。 传递给函数的整数索引指示要转换的元素的索引。 |
mapi2 | O(N) | O(N) | - | - | - | 生成一个集合,其元素是将给定函数应用到两个集合的对应元素的结果,同时传递元素的索引。 两个输入数组的长度必须相同。 |
最大值 | O(N) | O(N) | O(N) | - | - | 使用 max 运算符返回集合中最大的元素。 |
maxBy | O(N) | O(N) | O(N) | - | - | 返回集合中最大的元素,通过使用函数结果的 最大值 进行比较。 |
maxElement | - | - | - | - | O(log(N)) | 根据用于集的排序返回集中的最大元素。 |
分钟 | O(N) | O(N) | O(N) | - | - | 使用 min 运算符返回集合中的最小元素。 |
minBy | O(N) | O(N) | O(N) | - | - | 返回集合中的最小元素,使用函数结果上的 min 运算符进行比较。 |
minElement | - | - | - | - | O(log(N)) | 根据用于集的排序返回集中的最低元素。 |
ofArray | - | O(N) | O(1) | O(N) | O(N) | 创建一个集合,其中包含与给定数组相同的元素。 |
ofList | O(N) | - | O(1) | O(N) | O(N) | 创建包含与给定列表相同的元素的集合。 |
ofSeq | O(N) | O(N) | - | O(N) | O(N) | 创建一个集合,其中包含与给定序列相同的元素。 |
pairwise | - | - | O(N) | - | - | 返回输入序列中每个元素及其前置元素的序列,但第一个元素除外,该元素仅作为第二个元素的前置元素返回。 |
分区 | O(N) | O(N) | - | O(N) | O(N) | 将集合拆分为两个集合。 第一个集合包含给定谓词返回 true 的元素,第二个集合包含给定谓词返回 false 的元素。 |
取代 | O(N) | O(N) | - | - | - | 返回一个数组,其中所有元素都根据指定的排列进行排列。 |
摘 | O(N) | O(N) | O(N) | O(log(N)) | - | 将给定函数应用于连续元素,返回函数返回 Some 的第一个结果。 如果函数从不返回 Some, System.Collections.Generic.KeyNotFoundException 则会引发。 |
randomChoice | O(1) | O(1) | O(1) | - | - | 返回给定集合中的随机元素。 |
randomChoiceBy | O(1) | O(1) | O(1) | - | - | 从具有指定 randomizer 函数的给定集合中返回一个随机元素。 |
randomChoiceWith | O(1) | O(1) | O(1) | - | - | 从具有指定 Random 实例的给定集合中返回随机元素。 |
randomChoices | O(count) | O(count) | O(count) | - | - | 返回给定集合中随机元素的集合,可以多次选择每个元素。 |
randomChoicesBy | O(count) | O(count) | O(count) | - | - | 返回给定集合中具有指定 randomizer 函数的随机元素的集合,可以多次选择每个元素。 |
randomChoicesWith | O(count) | O(count) | O(count) | - | - | 返回给定集合中具有指定 Random 实例的随机元素的集合,可以多次选择每个元素。 |
randomSample | O(count) | O(count) | O(count) | - | - | 从给定集合中返回一个随机元素样本,每个元素只能选择一次。 |
randomSampleBy | O(count) | O(count) | O(count) | - | - | 使用指定 randomizer 函数从给定的 colleciton 返回一个随机元素样本,每个元素只能选择一次。 |
randomSampleWith | O(count) | O(count) | O(count) | - | - | 返回给定集合中具有指定 Random 实例的元素的随机样本,每个元素只能选择一次。 |
randomShuffle | O(N) | O(N) | O(N) | - | - | 以随机顺序返回一个新的集合。 |
randomShuffleBy | O(N) | O(N) | O(N) | - | - | 使用指定的 randomizer 函数按随机顺序返回一个新集合。 |
randomShuffleWith | O(N) | O(N) | O(N) | - | - | 使用指定的 Random 实例按随机顺序返回一个新集合。 |
randomShuffleInPlace | O(N) | - | - | - | - | 通过将数组就地改变来按随机顺序对输入数组进行排序。 |
randomShuffleInPlaceBy | O(N) | - | - | - | - | 使用指定 randomizer 函数按随机顺序对输入数组进行排序,方法是就地改变数组。 |
randomShuffleInPlaceWith | O(N) | - | - | - | - | 通过就地更改数组,按随机顺序对 Random 输入数组进行排序。 |
readonly | - | - | O(N) | - | - | 创建委托给给定序列对象的序列对象。 此作可确保类型强制转换无法重新发现和改变原始序列。 例如,如果给定数组,则返回的序列将返回数组的元素,但无法将返回的序列对象强制转换为数组。 |
减少 | O(N) | O(N) | O(N) | - | - | 将函数应用于集合的每个元素,通过计算线程化累加器参数。 此函数首先将函数应用于前两个元素,将此结果与第三个元素一起传递到函数中,依此类推。 该函数返回最终结果。 |
reduceBack | O(N) | O(N) | - | - | - | 将函数应用于集合的每个元素,通过计算线程化累加器参数。 如果输入函数为 f 且元素为 i0...iN,此函数计算 f i0 (...(f iN-1 iN))。 |
删除 | - | - | - | O(log(N)) | O(log(N)) | 从映射的域中删除元素。 如果元素不存在,则不会引发异常。 |
复制 | - | O(N) | - | - | - | 创建指定长度的列表,其中每个元素都设置为给定值。 |
转速 | O(N) | O(N) | - | - | - | 返回一个新列表,其中包含以相反顺序排列的元素。 |
审查 | O(N) | O(N) | O(N) | - | - | 将函数应用于集合的每个元素,通过计算线程化累加器参数。 此作将函数应用于列表的第二个参数和第一个元素。 然后,该作会将此结果连同第二个元素一起传递到函数中,依此类推。 最后,该作返回中间结果列表和最终结果。 |
scanBack | O(N) | O(N) | - | - | - | 类似于 foldBack作,但同时返回中间结果和最终结果。 |
singleton | - | - | O(1) | - | O(1) | 返回只生成一个项的序列。 |
集 | O(1) | - | - | - | - | 将数组的元素设置为指定值。 |
跳过 | - | - | O(N) | - | - | 返回一个序列,该序列跳过基础序列的 N 个元素,然后生成序列的剩余元素。 |
skipWhile | - | - | O(N) | - | - | 返回一个序列,当循环访问时,当给定谓词返回 true 并生成序列的剩余元素时,将跳过基础序列的元素。 |
排序 | O(N*log(N)) 平均值 O(N^2) 最坏的情况 |
O(N*log(N)) | O(N*log(N)) | - | - | 按元素值对集合进行排序。 使用 比较比较比较元素。 |
sortBy | O(N*log(N)) 平均值 O(N^2) 最坏的情况 |
O(N*log(N)) | O(N*log(N)) | - | - | 使用给定投影提供的键对给定列表进行排序。 使用 比较比较键。 |
sortInPlace | O(N*log(N)) 平均值 O(N^2) 最坏的情况 |
- | - | - | - | 通过将数组的元素就地和给定的比较函数进行可变,对数组的元素进行排序。 使用 比较比较来比较元素。 |
sortInPlaceBy | O(N*log(N)) 平均值 O(N^2) 最坏的情况 |
- | - | - | - | 通过将数组的元素设置为原位并使用键的给定投影对数组的元素进行排序。 使用 比较比较来比较元素。 |
sortInPlaceWith | O(N*log(N)) 平均值 O(N^2) 最坏的情况 |
- | - | - | - | 通过将数组的元素调整到位并使用给定的比较函数作为顺序对数组的元素进行排序。 |
sortWith | O(N*log(N)) 平均值 O(N^2) 最坏的情况 |
O(N*log(N)) | - | - | - | 使用给定的比较函数作为顺序并返回新集合,对集合的元素进行排序。 |
子项 | O(N) | - | - | - | - | 生成一个数组,其中包含由起始索引和长度指定的给定子范围。 |
总和 | O(N) | O(N) | O(N) | - | - | 返回集合中元素的总和。 |
sumBy | O(N) | O(N) | O(N) | - | - | 返回通过将函数应用于集合的每个元素生成的结果的总和。 |
tail | - | O(1) | - | - | - | 返回没有其第一个元素的列表。 |
拿 | - | - | O(N) | - | - | 返回序列的元素,最多返回指定计数。 |
takeWhile | - | - | O(1) | - | - | 返回一个序列,当循环访问时,在给定谓词返回 true 时生成基础序列的元素,然后不返回更多元素。 |
toArray | - | O(N) | O(N) | O(N) | O(N) | 从给定集合创建数组。 |
toList | O(N) | - | O(N) | O(N) | O(N) | 从给定集合创建列表。 |
toSeq | O(1) | O(1) | - | O(1) | O(1) | 从给定集合创建序列。 |
截断 | - | - | O(1) | - | - | 返回一个序列,当枚举时,返回的元素不超过 N 个。 |
tryFind | O(N) | O(N) | O(N) | O(log(N)) | - | 搜索满足给定谓词的元素。 |
tryFindIndex | O(N) | O(N) | O(N) | - | - | 搜索满足给定谓词的第一个元素,并返回匹配元素的索引,或者 None 不存在此类元素。 |
tryFindKey | - | - | - | O(log(N)) | - | 返回集合中满足给定谓词的第一个映射的键,如果未存在此类元素,则返回 None 。 |
tryPick | O(N) | O(N) | O(N) | O(log(N)) | - | 将给定函数应用于连续元素,返回函数返回 Some 某些值的第一个结果。 如果不存在此类元素,作将 None 返回 。 |
展开 | - | - | O(N) | - | - | 返回一个序列,其中包含给定计算生成的元素。 |
并 | - | - | - | - | O(M*log(N)) | 计算两组的并集。 |
unionMany | - | - | - | - | O(N1*N2...) | 计算集序列的并集。 |
解压缩 | O(N) | O(N) | O(N) | - | - | 将对列表拆分为两个列表。 |
unzip3 | O(N) | O(N) | O(N) | - | - | 将三重列表拆分为三个列表。 |
窗口 | - | - | O(N) | - | - | 返回一个序列,该序列生成包含从输入序列中绘制的元素的滑动窗口。 每个窗口都作为一个新的数组返回。 |
压缩包 | O(N) | O(N) | O(N) | - | - | 将两个集合合并成对列表。 这两个列表的长度必须相等。 |
zip3 | O(N) | O(N) | O(N) | - | - | 将三个集合合并到三重集合列表中。 列表的长度必须相等。 |