Partager via


Seq.cache<'T>, fonction (F#)

Retourne une séquence qui correspond à une version mise en cache de la séquence d'entrée.

Espace de noms/Chemin du module : Microsoft.FSharp.Collections.Seq

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

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

// Usage:
Seq.cache source

Paramètres

  • source
    Type : seq<'T>

    Séquence d'entrée.

Exceptions

Exception

Condition

ArgumentNullException

Levée lorsque la séquence d'entrée a la valeur Null.

Valeur de retour

Séquence de résultat.

Notes

Cette séquence de résultat aura les mêmes éléments que la séquence d'entrée. Le résultat peut être énuméré plusieurs fois. La séquence d'entrée est énumérée au plus une seule fois et uniquement si cela est nécessaire. La mise en cache d'une séquence est généralement utile lorsque l'évaluation répétée des éléments dans la séquence d'origine sollicite fortement les ressources informatiques ou si l'itération de la séquence provoque des effets secondaires que l'utilisateur ne veut pas voir se reproduire. Une fois que l'énumération de la séquence d'entrée a démarré, son énumérateur est maintenu actif par cet objet jusqu'à ce que l'énumération soit terminée. À ce stade, l'énumérateur sera supprimé. L'énumérateur peut être supprimé et le stockage de cache sous-jacent libéré en convertissant l'objet de séquence retourné en type IDisposable, et en appelant la méthode Dispose sur cet objet. L'objet de séquence peut ensuite être à nouveau énuméré et un nouvel énumérateur est utilisé.

Cette fonction se nomme Cache dans les assemblys compilés. Si vous accédez à la fonction à partir d'un langage autre que F# ou par réflexion, utilisez ce nom.

Exemple

L'exemple de code suivant montre comment utiliser Seq.cache pour éviter de recalculer des éléments d'une séquence.

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

Sortie

            

Sécurité des threads

L'énumération de la séquence de résultat est thread-safe dans le sens où plusieurs valeurs IEnumerator indépendantes peuvent être utilisées simultanément à partir de threads différents (les accès à la lookaside table (LAT) interne sont thread-safe). Les IEnumerator individuels ne sont généralement pas thread-safe et ne doivent pas être accessibles simultanément.

Plateformes

Windows 7, Windows Vista SP2, Windows XP SP3, Windows XP x64 SP2, Windows Server 2008 R2, Windows Server 2008 SP2, Windows Server 2003 SP2

Informations de version

Runtime F#

Pris en charge dans : 2.0, 4.0

Silverlight

Prise en charge dans : 3

Voir aussi

Référence

Collections.Seq, module (F#)

Microsoft.FSharp.Collections, espace de noms (F#)

Historique des modifications

Date

Historique

Motif

Août 2010

Ajout d'un exemple de code

Améliorations apportées aux informations.