在C#中,我如何记忆一个有两个参数的函数?
在memoization之前,我必须要使用curry吗?
我通常使用Wes Dyer wrote the Memoization code,但现在我需要两个参数
发布于 2009-03-11 06:22:54
您只需创建Memoize方法的重载版本,该方法具有三个泛型类型,并接受一个具有两个参数和两个参数的函数。它仍然返回一个无参数函数:
public static Func<R> Memoize<A1,A2,R>(this Func<A1,A2,R> f, A1 a1, A2 a2)
{
R value = default(R);
bool hasValue = false;
return () =>
{
if (!hasValue)
{
hasValue = true;
value = f(a1,a2);
}
return value;
};
}编辑:
或者,您需要为包含两个参数的KeyValuePair创建一个自定义IEqualityComparer,以便Memoize方法能够返回具有两个参数的函数:
public static Func<A1,A2,R> Memoize<A1,A2,R>(this Func<A1,A2,R> f, IEqualityComparer<KeyValuePair<A1,A2>> comparer)
{
var map = new Dictionary<KeyValuePair<A1,A2>,R>(comparer);
return (a1,a2) =>
{
R value;
KeyValuePair<A1,A2> key = new KeyValuePair<A1,A2>(a1,a2);
if (map.TryGetValue(key, out value)) {
return value;
}
value = f(a1,a2);
map.Add(key, value);
return value;
};
}发布于 2009-03-11 13:29:59
韦斯还有另一个帖子,他给了a two (or more) argument version of Memoize。它不需要自定义比较器。
发布于 2010-10-15 04:19:34
在新版本的.NET中,您可以通过使用元组来简化接受的解决方案的代码
public static Func<TParam1, TParam2, TReturn> Memoize<TParam1, TParam2, TReturn>(Func<TParam1, TParam2, TReturn> func)
{
var map = new Dictionary<Tuple<TParam1, TParam2>, TReturn>();
return (param1, param2) =>
{
var key = Tuple.Create(param1, param2);
TReturn result;
if (!map.TryGetValue(key, out result))
{
result = func(param1, param2);
map.Add(key, result);
}
return result;
};
}https://stackoverflow.com/questions/633508
复制相似问题