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

ArgumentNullException

在输入序列为 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,可移植

请参见

参考

Collections.Seq 模块 (F#)

Microsoft.FSharp.Collections 命名空间 (F#)