2010-05-28 10 views
7

En System.Interactive.dll (v1.0.2521.0) de Reactive Extensions, EnumerableEx tiene un método Memoize y un método MemoizeAll. La documentación de API es idéntica para ambos:System.Interactive: ¿diferencia entre Memoize() y MemoizeAll()?

Crea un enumerable que enumera el enumerable original solo una vez y almacena sus resultados en caché.

Sin embargo, estos métodos son claramente no idénticos. Si uso Memoize, mi enumerable tiene valores la primera vez que lo enumero, y parece estar vacío la segunda vez. Si uso MemoizeAll, entonces obtengo el comportamiento que esperaría de la descripción de cualquiera de los métodos: puedo enumerar el resultado tantas veces como quiera y obtengo los mismos resultados cada vez, pero la fuente solo se enumera una vez.

¿Alguien me puede decir cuál es la diferencia entre estos métodos? ¿Cuál es el caso de uso para Memoize? Parece un método bastante inútil con documentación realmente confusa.

Respuesta

7

para decirlo de manera simple, MemoizeAll solo almacena en caché los elementos que realmente usa, pero conserva todos los elementos almacenados en caché para siempre. Memoize guarda en caché los elementos inmediatamente, pero solo hasta el tamaño de búfer especificado. Esto le permite ser mucho más eficiente con el uso de la memoria, etc., pero solo desea utilizar este último si comprende cómo lo usarán todos los consumidores de la fuente enumerable.

Hay una muy buena explicación de la diferencia en esta entrada del blog: http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx

+0

Gracias, eso es de hecho una buena explicación. Tal vez las versiones futuras de Reactive Extensions ampliarán la descripción de 'Memoize'. –