Seq.cache<'T> 函数 (F#)
返回一个序列,该序列对应于输入序列的缓存版本。
命名空间/模块路径:Microsoft.FSharp.Collections.Seq
程序集:FSharp.Core(在 FSharp.Core.dll 中)
// Signature:
Seq.cache : seq<'T> -> seq<'T>
// Usage:
Seq.cache source
参数
source
类型:seq<'T>输入序列。
异常
异常 |
Condition |
---|---|
在输入序列为 null 时引发。 |
返回值
结果序列。
备注
此结果序列将具有与输入序列相同的元素。 可多次对结果进行枚举。 仅必要时才对输入序列进行枚举,而且最多枚举一次。 通常,如果反复计算原始序列中的项需要消耗大量计算资源,或者循环访问序列会产生副作用,而用户不希望这些副作用多次重复出现,则对序列进行缓存是比较有用的。 一旦启动对输入序列的枚举,其枚举器即由此对象保持为活动状态,直至枚举完成。 枚举完成时,枚举器将被释放。 通过将返回的序列对象转换为类型 IDisposable 并对此对象调用 Dispose 方法,可释放枚举器和基础缓存存储。 然后,可重新枚举序列对象,并将使用新枚举器。
此函数在编译的程序集中名为 Cache。 如果从 F# 以外的语言中访问函数,或通过反射访问成员,请使用此名称。
示例
以下代码示例演示如何使用 Seq.cache 来避免序列中的元素的重复计算。
// Recursive isprime function.
let isPrime n =
let rec check i =
i > n/2 || (n % i <> 0 && check (i + 1))
check 2
let seqPrimes = seq { for n in 2 .. 10000 do if isPrime n then yield n }
// Cache the sequence to avoid recomputing the sequence elements.
let cachedSeq = Seq.cache seqPrimes
for index in 1..5 do
printfn "%d is prime." (Seq.nth (Seq.length cachedSeq - index) cachedSeq)
Output
线程安全
可从不同线程同时使用多个独立的 IEnumerator 值,从这个意义上来讲,对结果序列的枚举是线程安全的(对内部旁视表的访问是线程安全的)。 通常,各个单独的 IEnumerator 不是线程安全的,不应对其进行并发访问。
平台
Windows 8,Windows 7,Windows server 2012中,Windows server 2008 R2
版本信息
F#核心库版本
支持:2.0,4.0,可移植