在System.Interactive.dll (v1.0.2521.0)中,EnumerableEx有一个Memoize方法和一个MemoizeAll方法。API文档对于这两个文档都是相同的:
创建一个枚举,该枚举只枚举原始可枚举一次,并缓存其结果。
然而,这些方法显然并不相同。如果我使用Memoize,我的枚举在第一次枚举它时就有值,第二次似乎是空的。如果我使用MemoizeAll,那么我就可以从这两种方法的描述中得到我期望的行为--我可以根据自己的意愿多次枚举结果,每次都得到相同的结果,但是源只能枚举一次。
有人能告诉我这些方法的意图是什么吗?Memoize的用例是什么?这似乎是一个相当无用的方法,与真正令人困惑的文档。
发布于 2010-05-28 18:57:29
简单地说,MemoizeAll只缓存您实际使用的项--但是它永远保留所有缓存的项。Memoize会立即缓存项,但只能缓存指定的缓冲区大小。这使您可以更有效地使用内存,等等,但是您只想使用后者,前提是您了解可枚举源的所有使用者将如何使用它。
在这篇博客文章中,有一个非常好的解释来解释这种差异:http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx
https://stackoverflow.com/questions/2931582
复制相似问题