System.Interactive: Разница между Memoize () и MemoizeAll ()? - PullRequest
7 голосов
/ 28 мая 2010

В System.Interactive.dll (v1.0.2521.0) из Reactive Extensions EnumerableEx имеет метод Memoize и метод MemoizeAll. Документация API для них одинакова:

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

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

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

1 Ответ

7 голосов
/ 28 мая 2010

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

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

...