C #: возможно ли использовать выражения или функции в качестве ключей в словаре? - PullRequest
7 голосов
/ 15 июля 2009

Будет ли работать использование Expression<Func<T>> или Func<T> в качестве ключей в словаре? Например для кеширования результата тяжелых вычислений.

Например, немного изменив мой основной кеш с другого вопроса моего:

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: Нет, подождите ... на самом деле это не так. Ну, для обычных методов это так. Но не для лямбд. Они получают различные случайные имена методов, даже если они выглядят одинаково. Ну хорошо, с ",)

Ответы [ 2 ]

3 голосов
/ 15 июля 2009

Вы можете использовать любой тип объекта, если он является экземпляром. Это даже будучи делегатом, но я не рекомендую использовать делегаты в качестве ключей, поскольку они не предназначены для этого. Я не уверен, что независимо созданные делегаты выдают один и тот же хэш-код, даже меньше, если их можно сравнивать (сравнивать).

0 голосов
/ 15 июля 2009

Это может быть растяжка, но, используя Dynamic Language Runtime (IronPython и т. Д.), Вы определенно можете запускать произвольные фрагменты кода из словаря.

Затем вы можете запускать код на лету по мере необходимости, кэшировать результат в первый раз и использовать кэшированный результат для всех будущих вызовов.

Если бы у вас было много вычислений, могу поспорить, что в итоге все получится довольно хорошо. Хотя это все ситуативно, и я не совсем уверен, чего вы пытаетесь достичь. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...