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>輸入序列。
例外狀況
例外狀況 |
條件 |
---|---|
當輸入序列為 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,可攜式執行檔 (PE)。