Система. Интерактивный: различие между Memoize () и MemoizeAll ()?

В System.Interactive.dll (v1.0.2521.0) от реактивных расширений, EnumerableEx имеет обоих a Memoize метод и a MemoizeAll метод. Документация API идентична для них обоих:

Создает счетное, которое перечисляет оригинал, счетный только однажды, и кэширует его результаты.

Однако эти методы ясно не идентичны. Если я использую Memoize, мое счетное имеет значения в первый раз, когда я перечисляю его, и, кажется, пустеют во второй раз. Если я использую MemoizeAll затем я получаю поведение, которое я ожидал бы от описания любого метода - я могу перечислять результат так много раз, как я хочу и получаю те же результаты каждый раз, но источник только перечисляется однажды.

Кто-либо может сказать мне, каково намеченное различие между этими методами? Для чего пример использования Memoize? Это походит на довольно бесполезный метод с действительно запутывающей документацией.

7
задан Joel Mueller 28 May 2010 в 18:32
поделиться

1 ответ

проще говоря, MemoizeAll кэширует только те элементы, которые вы действительно используете - но он хранит все кэшированные элементы вечно. Memoize кэширует элементы немедленно, но только до указанного размера буфера. Это позволяет вам гораздо эффективнее использовать память и т.д., но последний вариант стоит использовать только в том случае, если вы понимаете, как все потребители перечисляемого источника будут его использовать.

В этом блоге есть отличное объяснение разницы: http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx

7
ответ дан 7 December 2019 в 07:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: