在Reactive Extensions的System.Interactive.dll(v1.0.2521.0)中,EnumerableEx
同时具有Memoize
方法和MemoizeAll
方法。两者的API文档都是相同的:
但是,这些方法显然并不相同。如果我使用Memoize
,则我第一次枚举时我的enumerable具有值,而第二次似乎为空。如果我使用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