Поделиться через


Функция 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>

    Входная последовательность.

Исключения

Исключение

Атрибут Condition

ArgumentNullException

Создается при указании в качестве входной последовательности значения 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 2008 Server R2

Сведения о версии

Основной версии библиотеки F#

Поддерживается в: 2.0, 4.0, портативное

См. также

Ссылки

Модуль Collections.Seq (F#)

Пространство имен Microsoft.FSharp.Collections (F#)