7

在 Reactive Extensions 的 System.Interactive.dll (v1.0.2521.0) 中,EnumerableEx既有Memoize方法又有MemoizeAll方法。两者的 API 文档是相同的:

创建一个枚举原始枚举仅一次并缓存其结果的枚举。

然而,这些方法显然不相同。如果我使用Memoize,我的 enumerable 在我第一次枚举它时具有值,而第二次似乎是空的。如果我使用MemoizeAll,那么我会从任何一种方法的描述中得到我期望的行为——我可以根据需要多次枚举结果,并且每次都得到相同的结果,但源只枚举一次。

谁能告诉我这些方法之间的预期区别是什么?用例是Memoize什么?这似乎是一个相当无用的方法,文档非常混乱。

4

1 回答 1

7

简而言之,MemoizeAll仅缓存您实际使用的项目 - 但它永远保留所有缓存的项目。 Memoize立即缓存项目,但只缓存到指定的缓冲区大小。这可以让您在内存使用等方面更有效率,但如果您了解可枚举源的所有消费者将如何使用它,您只想使用后者。

这篇博客文章中的差异有一个非常好的解释:http: //bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming -side-effects.aspx

于 2010-05-28T18:57:29.553 回答