2009-07-15 4 views
7

Serait-il utile d'utiliser Expression<Func<T>> ou Func<T> comme clés dans un dictionnaire? Par exemple pour mettre en cache le résultat de calculs lourds.C#: Est-il possible d'utiliser des expressions ou des fonctions en tant que clés dans un dictionnaire?

Par exemple, le changement de mon cache de base d'un different question de mes un peu:

public static class Cache<T> 
{ 
    // Alternatively using Expression<Func<T>> instead 
    private static Dictionary<Func<T>, T> cache; 
    static Cache() 
    { 
     cache = new Dictionary<Func<T>, T>(); 
    } 
    public static T GetResult(Func<T> f) 
    { 
     if (cache.ContainsKey(f)) 
      return cache[f]; 

     return cache[f] = f(); 
    } 
} 

Est-ce que ce même travail?

Modifier: Après un test rapide, il semble que cela fonctionne réellement. Mais j'ai découvert qu'il pourrait probablement être plus générique, car il serait désormais un cache par type de retour ... pas sûr comment le changer de sorte que cela ne se produira pas si ... hmm

Edit 2 : Non, attendez ... ce n'est pas le cas. Eh bien, pour les méthodes régulières, c'est le cas. Mais pas pour les lambdas. Ils obtiennent divers noms de méthodes aléatoires, même s'ils se ressemblent. Eh bien c »,)

+2

Pourquoi faites-vous cela? –

+0

Je ne suis pas. J'ai juste trébuché sur la pensée tout en trouvant la substance de cache dans mon autre question et suis devenu curieux :) – Svish

+0

Les points bonis pour la curiosité investigatrice, mais je ne peux pas vraiment voir n'importe quelle application réelle pour la technique. D'autre part, l'idée a un facteur de refroidissement élevé si cela aurait fonctionné. –

Répondre

3

Vous pouvez utiliser tout type d'objet, tant qu'il est une instance. Cela étant même un délégué, mais je ne pas vous recommandons d'utiliser des délégués en tant que clés parce qu'ils ne sont pas conçus pour Je ne suis pas sûr que les délégués créés indépendamment produisent le même code de hachage, encore moins s'ils peuvent être comparés (égalable)

+0

On dirait que vous avez raison sur le fait que les délégués ne fonctionnent pas bien pour les clés =/ – Svish

+0

Les délégués se comparent par référence, pas "structurellement". C'est-à-dire que deux délégués qui appellent le même code mais sont des instances différentes se comparent comme étant inégaux. –

+0

@Eric Lippert: Alors j'ai pensé, c'est un mécanisme de repli naturel quand la "structure" compare sans signification :) –

0

Cela peut être un étirement, mais en utilisant le Dynamic Language Runtime (IronPython, etc) vous pourrait certainement exécuter des extraits de code arbitraires à partir d'un dictionnaire

Ensuite, vous pouvez exécuter le code à la volée au besoin, mettre en cache le résultat la première fois, un d utiliser le résultat mis en cache pour tous les futurs appels.

Si vous aviez beaucoup de calculs, je parie que cela finirait plutôt bien. Tout est situationnel cependant, et je ne suis pas sûr exactement ce que vous essayez d'accomplir. :)

Questions connexes