在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

10-07 23:22