2009-03-11 5 views

Répondre

5

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; 
     }; 
} 
2

Vous devriez pouvoir memoize une paire. La fonction deux arg appelle une seule fonction arg que vous notez.

5

Wes a un autre message où il donne a two (or more) argument version of Memoize. Il ne nécessite pas de comparateur personnalisé.

+0

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

3

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; 
     }; 
    } 
1

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