CVe*_*tex 4 .net c# functional-programming memoization
在C#中,如何用两个参数记忆函数?
在记忆之前我必须要咖喱吗?
Wes Dyer编写了我通常使用的Memoization代码,但现在我需要两个参数
您只需创建具有三种泛型类型的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;
};
}
Run Code Online (Sandbox Code Playgroud)
编辑:
或者,您需要为包含两个参数的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;
};
}
Run Code Online (Sandbox Code Playgroud)