在C#中,如何用两个参数记忆函数?
在记忆之前我必须要咖喱吗?
Wes Dyer编写了我通常使用的Memoization代码,但现在我需要两个参数
您只需创建具有三种泛型类型的Memoize方法的重载版本,并使用具有两个参数的函数和两个参数.它仍然返回无参数函数:
public static FuncMemoize (this Func 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 FuncMemoize (this Func f, IEqualityComparer > comparer) { var map = new Dictionary ,R>(comparer); return (a1,a2) => { R value; KeyValuePair key = new KeyValuePair (a1,a2); if (map.TryGetValue(key, out value)) { return value; } value = f(a1,a2); map.Add(key, value); return value; }; }
Wes有另一个帖子,他给出了Memoize的两个(或更多)参数版本.它不需要自定义比较器.