Skip to content

Instantly share code, notes, and snippets.

@bltavares
Created October 4, 2011 16:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bltavares/1262019 to your computer and use it in GitHub Desktop.
Save bltavares/1262019 to your computer and use it in GitHub Desktop.
C# Memmoizer
namespace Memoizer
{
class Example
{
Memoizer Memoizer = new Memoizer();
bool AlwaysTrue()
{
return Memoizer.Memoize("AlwaysTrue", () => true);
}
ExpensiveObject GetFromGithub(string hash, int time)
{
return Memoizer.Memoize("GetFromFacebook", () => (new GitHubber()).ReallyExpensiveMethod() );
}
}
}
namespace Memoizer
{
/// <summary>
/// Store a value so you don't run it twice
/// </summary>
public class Memoizer
{
private IDictionary<string, object> _frozenValues = new Dictionary<string, object>();
/// <summary>
/// Store a value so you don't run it twice
/// </summary>
/// <typeparam name="U">The type returned by the function</typeparam>
/// <param name="name">The name to be persisted. Can't already exist.</param>
/// <param name="lambda">The function to be used.</param>
/// <returns>The value of the lambda.</returns>
public U Memoize<U>(string name, Func<U> lambda = null)
{
if (!_frozenValues.ContainsKey(name))
{
if (lambda == null)
return default(U);
_frozenValues.Add(name, lambda.Invoke());
}
return (U)_frozenValues[name];
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment