Esporta (0) Stampa
Espandi tutto
Espandi Riduci a icona
Il presente articolo è stato tradotto manualmente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale

Funzione Seq.cache<'T> (F#)

Restituisce una sequenza che corrisponde a una versione memorizzata nella cache della sequenza di input.

Percorso spazio dei nomi/modulo: Microsoft.FSharp.Collections.Seq

Assembly: FSharp.Core (in FSharp.Core.dll)

// Signature:
Seq.cache : seq<'T> -> seq<'T>

// Usage:
Seq.cache source

source

Tipo: seq<'T>

Sequenza di input.

Exception

Condizione

ArgumentNullException

Generata se la sequenza di input è Null.

Sequenza risultante.

La sequenza risultante conterrà gli stessi elementi della sequenza di input. È possibile enumerare il risultato più volte. La sequenza di input viene enumerata al massimo una volta ed esclusivamente se necessario. L'operazione di memorizzazione nella cache di una sequenza è in genere utile se la valutazione ripetuta degli elementi nella sequenza originale risulta onerosa a livello di calcolo oppure se l'iterazione della sequenza provoca effetti collaterali che l'utente non desidera siano ripetuti più volte. Una volta avviata l'enumerazione della sequenza di input, questo oggetto manterrà attivo il relativo enumeratore finché l'enumerazione non è stata completata. A quel punto, l'enumeratore verrà eliminato. È possibile eliminare l'enumeratore e liberare la memoria occupata nella cache sottostante convertendo l'oggetto sequenza restituito nel tipo IDisposable e richiamando il metodo Dispose su tale oggetto. Sarà quindi possibile enumerare nuovamente l'oggetto sequenza per cui verrà utilizzato un enumeratore aggiornato.

Questa funzione è denominata Cache negli assembly compilati. Utilizzare questo nome se si accede alla funzione da un linguaggio diverso da F# o tramite reflection.

Nell'esempio di codice seguente viene illustrato come utilizzare Seq.cache per evitare di ricalcolare gli elementi di una sequenza.

// 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

              
                9973 è primo.
              
              
                9967 è primo.
              
              
                9949 è primo.
              
              
                9941 è primo.
              
              
                9931 è primo.
              
            

L'enumerazione della sequenza risultante è thread-safe nel senso che è possibile utilizzare contemporaneamente più valori IEnumerator indipendenti da diversi thread (gli accessi alla tabella lookaside interna sono thread-safe). In genere un singolo IEnumerator non è thread-safe e non è consentito accedervi contemporaneamente da più thread.

Windows 8, Windows 7, Windows Server 2012, Windows Server 2008 R2

Versioni della libreria di base F#

Supportato in: 2,0, 4,0, portabile

Aggiunte alla community

AGGIUNGI
Mostra:
© 2015 Microsoft