首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双参数记忆化

双参数记忆化
EN

Stack Overflow用户
提问于 2009-03-11 06:09:00
回答 5查看 1.8K关注 0票数 4

在C#中,我如何记忆一个有两个参数的函数?

在memoization之前,我必须要使用curry吗?

我通常使用Wes Dyer wrote the Memoization code,但现在我需要两个参数

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-11 06:22:54

您只需创建Memoize方法的重载版本,该方法具有三个泛型类型,并接受一个具有两个参数和两个参数的函数。它仍然返回一个无参数函数:

代码语言:javascript
复制
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方法能够返回具有两个参数的函数:

代码语言:javascript
复制
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;
      };
}
票数 5
EN

Stack Overflow用户

发布于 2009-03-11 13:29:59

韦斯还有另一个帖子,他给了a two (or more) argument version of Memoize。它不需要自定义比较器。

票数 5
EN

Stack Overflow用户

发布于 2010-10-15 04:19:34

在新版本的.NET中,您可以通过使用元组来简化接受的解决方案的代码

代码语言:javascript
复制
    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;
        };
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/633508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档