两个参数Memoization

CVe*_*tex 4 .net c# functional-programming memoization

在C#中,如何用两个参数记忆函数?

在记忆之前我必须要咖喱吗?

Wes Dyer编写了我通常使用的Memoization代码,但现在我需要两个参数

Guf*_*ffa 5

您只需创建具有三种泛型类型的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)


Cra*_*ntz 5

Wes有另一个帖子,他给出了Memoize的两个(或更多)参数版本.它不需要自定义比较器.