En C# comment mémoriser une fonction avec deux arguments?Deux arguments Memoization
Dois-je procéder avant la mémorisation?
Wes Dyer wrote the Memoization code J'utilise généralement, mais maintenant je besoin de deux arguments
En C# comment mémoriser une fonction avec deux arguments?Deux arguments Memoization
Dois-je procéder avant la mémorisation?
Wes Dyer wrote the Memoization code J'utilise généralement, mais maintenant je besoin de deux arguments
Vous venez de créer une version surchargée de la méthode Memoize qui a trois types génériques et prend une fonction avec deux paramètres, et les deux arguments. Il retourne encore une fonction parameterless:
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;
};
}
Edit:
Sinon, vous avez besoin de faire un IEqualityComparer sur commande pour un KeyValuePair qui contient les deux arguments, la méthode Memoize pour pouvoir retourner une fonction avec deux paramètres :
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;
};
}
Vous devriez pouvoir memoize une paire. La fonction deux arg appelle une seule fonction arg que vous notez.
Wes a un autre message où il donne a two (or more) argument version of Memoize. Il ne nécessite pas de comparateur personnalisé.
Avec les nouvelles versions de .NET vous pouvez simplifier le code de la solution acceptée un peu en utilisant tuples
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;
};
}
Je l'ai fait aussi un travail sur memoization en C#. Mes résultats sont similaires mais utilisent une clé de dictionnaire dérivée de la concaténation des codes de hachage de l'objet d'entrée. Le modèle peut être étendu à autant d'entrées que Func <> permettra.
Se plus ici: http://bit.ly/t6iNJP
Oui, ce code est beaucoup mieux par Wes. Vous et Guffa avez raison, mais Guffa a fait plus d'efforts, alors je lui en donne. Merci quand même! – CVertex