Freigeben über


Seq.cache<'T>-Funktion (F#)

Aktualisiert: August 2010

Gibt eine Sequenz zurück, die einer zwischengespeicherten Version der Eingabesequenz entspricht.

Namespace/Modulpfad: Microsoft.FSharp.Collections.Seq

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

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

// Usage:
Seq.cache source

Parameter

  • source
    Typ: seq<'T>

    Die Eingabesequenz.

Ausnahmen

Ausnahme

Bedingung

ArgumentNullException

Wird ausgelöst, wenn die Eingabesequenz NULL ist.

Rückgabewert

Die Ergebnissequenz.

Hinweise

Diese Ergebnissequenz verfügt über die gleichen Elemente wie die Eingabesequenz. Das Ergebnis kann mehrmals aufgelistet werden. Die Eingabesequenz wird höchstens einmal und nur soweit es notwendig ist aufgelistet. Das Zwischenspeichern einer Sequenz empfiehlt sich immer dann, wenn ein wiederholtes Auswerten von Elementen in der ursprünglichen Sequenz rechenintensiv ist oder das Durchlaufen der Sequenz Nebeneffekte verursacht, deren wiederholtes Auftreten nicht erwünscht ist. Sobald die Enumeration der Eingabesequenz begonnen hat, wird der Enumerator von diesem Objekt aktiv gehalten, bis die Enumeration abgeschlossen wurde. An diesem Punkt wird der Enumerator freigegeben. Der Enumerator kann verworfen und der zugrunde liegende Cachespeicher freigegeben werden, indem das zurückgegebene Sequenzobjekt in den Typ IDisposable konvertiert und die Dispose-Methode für dieses Objekt aufgerufen wird. Das Sequenzobjekt kann dann erneut aufgelistet werden, und es wird ein neuer Enumerator verwendet.

Der Name dieser Funktion in kompilierten Assemblys lautet Cache. Verwenden Sie diesen Namen, wenn Sie in einer anderen .NET-Sprache als F# oder durch Reflektion auf die Funktion zugreifen.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie Sie mit Seq.cache verhindern, dass die Elemente einer Sequenz neu berechnet werden.

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

            

Threadsicherheit

Die Enumeration der Ergebnissequenz ist insofern threadsicher, als dass mehrere unabhängige IEnumerator-Werte parallel von verschiedenen Threads (Zugriffe auf die interne Look-aside-Tabelle sind threadsicher) verwendet werden können. Jeder einzelne IEnumerator ist i. d. R. nicht threadsicher; daher sollte kein paralleler Zugriff darauf erfolgen.

Plattformen

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

Versionsinformationen

F#-Runtime

Unterstützt in: 2.0, 4.0

Silverlight

Unterstützt in: 3

Siehe auch

Weitere Ressourcen

Collections.Seq-Modul (F#)

Microsoft.FSharp.Collections-Namespace (F#)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

August 2010

Codebeispiel hinzugefügt.

Informationsergänzung.