Svish
Svish

Reputation: 158191

C#: Is it possible to use expressions or functions as keys in a dictionary?

Would it work to use Expression<Func<T>> or Func<T> as keys in a dictionary? For example to cache the result of heavy calculations.

For example, changing my very basic cache from a different question of mine a bit:

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

Would this even work?

Edit: After a quick test, it seems like it actually works. But I discovered that it could probably be more generic, since it would now be one cache per return type... not sure how to change it so that wouldn't happen though... hmm

Edit 2: Noo, wait... it actually doesn't. Well, for regular methods it does. But not for lambdas. They get various random method names even if they look the same. Oh well c",)

Upvotes: 7

Views: 1543

Answers (2)

Brian MacKay
Brian MacKay

Reputation: 32037

This might be a stretch, but using the Dynamic Language Runtime (IronPython, etc) you could definitely run arbitrary code snippets from a dictionary.

Then you could run the code on the fly as needed, cache the result the first time, and use the cached result for all future calls.

If you had a lot of computations, I bet this would end up performing pretty well. It's all situational though, and I'm not sure exactly what you're trying to achieve. :)

Upvotes: 0

Cecil Has a Name
Cecil Has a Name

Reputation: 4992

You can use any type of object, as long as it is an instance. That even being a delegate, but I do not recommend using delegates as keys because they are not designed for that. I'm not sure that independently created delegates produce the same hash code, even less if they can be compared (equatable).

Upvotes: 3

Related Questions