2009-07-15 12 views
7

Funzionerebbe per utilizzare Expression<Func<T>> o Func<T> come chiavi in ​​un dizionario? Ad esempio per memorizzare nella cache il risultato di calcoli pesanti.C#: è possibile utilizzare espressioni o funzioni come chiavi in ​​un dizionario?

Ad esempio, modificare la cache molto di base da un different question mio un po ':

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(); 
    } 
} 

Sarebbe questo anche il lavoro?

Modifica: Dopo un test rapido, sembra che funzioni effettivamente. Ma ho scoperto che potrebbe probabilmente essere più generico, in quanto ora sarebbe una cache per tipo di ritorno ... non so come cambiare in modo che non sarebbe successo se ... hmm

Edit 2 : No, aspetta ... in realtà no. Bene, per i metodi regolari lo fa. Ma non per Lambda. Ottengono vari nomi di metodi casuali anche se sembrano uguali. Vabbè c",)

+2

Perché lo stai facendo? –

+0

Non lo sono. Ero inciampato nel pensiero mentre immaginavo la cache nella mia altra domanda e mi sono incuriosito :) – Svish

+0

Punti bonus per curiosità investigativa, ma non riesco davvero a vedere alcuna applicazione reale per la tecnica. D'altra parte, l'idea ha un fattore Cool alto se avrebbe funzionato. –

risposta

3

È possibile utilizzare qualsiasi tipo di oggetto, a patto che si tratta di un esempio. Che anche di essere un delegato, ma io non consiglia di utilizzare i delegati come chiavi perché non sono progettati per Non sono sicuro che i delegati creati in modo indipendente producano lo stesso codice hash, ancor meno se possono essere confrontati (equabile)

+0

Sembra che tu abbia ragione sui delegati che non funzionano bene per le chiavi =/ – Svish

+0

I delegati si confrontano per riferimento, non "strutturalmente". Cioè, due delegati che capita di chiamare lo stesso codice ma sono diverse istanze che si confronteranno come non uguali. –

+0

@Eric Lippert: Così ho pensato, è un meccanismo di fallback naturale quando "struttura" confronta priva di significato :) –

0

Questo potrebbe essere un allungamento, ma utilizzando il Dynamic Language Runtime (IronPython, ecc.) è possibile eseguire snippet arbitrari di codice da un dizionario

Quindi è possibile eseguire il codice al volo secondo necessità, memorizzare il risultato nella cache per la prima volta, d utilizzare il risultato memorizzato nella cache per tutte le chiamate future.

Se avevi molti calcoli, scommetto che questo finirebbe per funzionare piuttosto bene. È tutto a posto, però, e non sono sicuro di quello che stai cercando di ottenere. :)

Problemi correlati