2009-07-15 9 views
7

Expression<Func<T>>またはFunc<T>を辞書のキーとして使用できますか?例えば、重い計算の結果をキャッシュする。C#:式や関数を辞書のキーとして使用できますか?

例えば、鉱山のdifferent questionビットからの私の非常に基本的なキャッシュ変更:

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

することは、これはも動作しませんか?

編集:クイックテストの後、実際に動作するようです。しかし、私は、うーん...今...それはしかし起こらないようにそれを変更する方法がわからないの戻り値の型ごとにキャッシュされるので、それはおそらく、より一般的なことができることを発見し

編集2 : Noo、待って...それは実際にはありません。通常の方法ではそうです。しかし、ラムダのためではない。彼らは同じように見えても、さまざまなランダムメソッド名を取得します。まあC」、)

+2

なぜあなたはそれをやっていますか? –

+0

私はそうではありません。私はちょうど私の他の質問のキャッシュのものを把握し、好奇心を得ている間、思考を偶然見つけた:) – Svish

+0

調査の好奇心のためのボーナスポイントが、私は本当に技術のための実際のアプリケーションを参照することはできません。一方、このアイデアは、効果があったら、高いクールファクターを持っています。 –

答えて

3

あなたも、デリゲートいること。限り、それはインスタンスであるとして、オブジェクトの任意の型を使用できますが、彼らはのために設計されていないので、私はないはキーとしてデリゲートを使用することをお勧めします

+0

あなたは、デリゲートが鍵ではうまくいかないと思っているようです。/ – Svish

+0

代理人は「構造的に」ではなく、参照によって比較されます。つまり、同じコードを呼び出すが、異なるインスタンスである2つのデリゲートは、不等と比較します。 –

+0

@Eric Lippert:「構造」が無意味なものを比較するとき、それはナチュラルフォールバックのメカニズムだと思っています。 –

0

これはストレッチであるかもしれませんが、Dynamic Language Runtime(IronPythonなど)を使用すると、あなたは同じハッシュコードを生成することができません。

次に、必要に応じてオンザフライでコードを実行し、最初に結果をキャッシュすることができます。将来のすべての呼び出しでキャッシュされた結果を使用します。

計算量が多かった場合は、これがうまくいくと思います。しかし、それはすべての状況ですが、私はあなたが達成しようとしていることを正確にはわかりません。 :)

関連する問題