В System.Interactive.dll (v1.0.2521.0) от реактивных расширений, EnumerableEx
имеет обоих a Memoize
метод и a MemoizeAll
метод. Документация API идентична для них обоих:
Создает счетное, которое перечисляет оригинал, счетный только однажды, и кэширует его результаты.
Однако эти методы ясно не идентичны. Если я использую Memoize
, мое счетное имеет значения в первый раз, когда я перечисляю его, и, кажется, пустеют во второй раз. Если я использую MemoizeAll
затем я получаю поведение, которое я ожидал бы от описания любого метода - я могу перечислять результат так много раз, как я хочу и получаю те же результаты каждый раз, но источник только перечисляется однажды.
Кто-либо может сказать мне, каково намеченное различие между этими методами? Для чего пример использования Memoize
? Это походит на довольно бесполезный метод с действительно запутывающей документацией.
проще говоря, MemoizeAll
кэширует только те элементы, которые вы действительно используете - но он хранит все кэшированные элементы вечно. Memoize
кэширует элементы немедленно, но только до указанного размера буфера. Это позволяет вам гораздо эффективнее использовать память и т.д., но последний вариант стоит использовать только в том случае, если вы понимаете, как все потребители перечисляемого источника будут его использовать.
В этом блоге есть отличное объяснение разницы: http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx