次の方法で共有


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>

    入力シーケンス。

例外

例外

状態

ArgumentNullException

入力シーケンスが null の場合にスローされます。

戻り値

結果のシーケンス。

解説

この結果のシーケンスは、入力シーケンスと同じ要素を持ちます。結果は複数回列挙できます。入力シーケンスは、最大 1 回、必要な範囲のみ列挙されます。シーケンスをキャッシュすることは、一般に、元のシーケンス内の項目を繰り返し評価すると計算負荷が高い場合、またはシーケンスを反復処理すると複数回繰り返したくない副作用が生じる場合に役立ちます。入力シーケンスの列挙が開始されると、その列挙子は、列挙が完了するまでの間、このオブジェクトによってアクティブ状態で維持されます。完了時点で、列挙子は破棄されます。返されたシーケンス オブジェクトを 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)

出力

  
  
  
  
  

スレッド セーフ

複数の独立した 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#)