2010-05-28 4 views
7

In System.Interactive.dll (v1.0.2521.0) von reaktiven Erweiterungen hat EnumerableEx sowohl eine Memoize Methode als auch eine MemoizeAll Methode. Die API-Dokumentation ist für beide identisch:System.Interactive: Unterschied zwischen Memoize() und MemoizeAll()?

Erstellt ein Enumerable, das das ursprüngliche Enumerable nur einmal aufzählt und seine Ergebnisse zwischenspeichert.

Diese Methoden sind jedoch eindeutig nicht identisch. Wenn ich Memoize verwende, hat mein Enumerable Werte, wenn ich es das erste Mal aufzähle, und scheint das zweite Mal leer zu sein. Wenn ich MemoizeAll verwende, dann bekomme ich das Verhalten, das ich von der Beschreibung beider Methoden erwarten würde - ich kann das Ergebnis so oft wie ich möchte aufzählen und jedes Mal die gleichen Ergebnisse erhalten, aber die Quelle wird nur einmal gezählt.

Kann mir jemand sagen, was der beabsichtigte Unterschied zwischen diesen Methoden ist? Was ist der Anwendungsfall für Memoize? Es scheint eine ziemlich nutzlose Methode mit wirklich verwirrender Dokumentation zu sein.

Antwort

7

um es wirklich einfach zu setzen, nur MemoizeAll speichert nur Objekte, die Sie tatsächlich verwenden - aber es gilt für alle zwischengespeicherten Elemente für immer. Memoize speichert Objekte sofort, aber nur bis zur angegebenen Puffergröße. Auf diese Weise können Sie die Speichernutzung effizienter gestalten, aber Sie möchten nur Letzteres verwenden, wenn Sie wissen, wie alle Verbraucher der aufzählbaren Quelle es verwenden werden.

Es gibt eine wirklich große Erklärung des Unterschiedes in diesem Blog-Eintrag: http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx

+0

Danke, das ist in der Tat eine gute Erklärung. Vielleicht werden zukünftige Versionen von Reactive Extensions die Beschreibung von 'Memoize' erweitern. –