Хранение кэшированных результатов в словаре , List > неудобно для меня, потому что я хочу, чтобы кэш ASP.NET обрабатывал для меня срок действия, а не кэшировал все результаты навсегда, но в остальном это хорошо решение. Я думаю, что в конечном итоге я буду использовать словарь Уилла , string> для кэширования строки, которую я могу использовать в ключе кэширования ASP.NET.
Некоторые первоначальные тесты показывают, что равенство делегатов делает «правильную вещь», как говорили другие, но Delegate.GetHashCode патологически бесполезен. Отражатель показывает
public override int GetHashCode()
{
return base.GetType().GetHashCode();
}
Таким образом, любой предикат возвращает тот же результат.
Моя оставшаяся проблема заключалась в том, как работает равенство для анонимных делегатов. Что значит «один и тот же метод, вызываемый для одной и той же цели»? Кажется, что, пока делегат был определен в том же месте, ссылки равны. Делегаты с одинаковым телом, определенным в разных местах, не являются.
static Predicate<int> Test()
{
Predicate<int> test = delegate(int i) { return false; };
return test;
}
static void Main()
{
Predicate<int> test1 = Test();
Predicate<int> test2 = Test();
Console.WriteLine(test1.Equals( test2 )); // True
test1 = delegate(int i) { return false; };
test2 = delegate(int i) { return false; };
Console.WriteLine(test1.Equals( test2 )); // False
}
Это должно быть хорошо для моих нужд. Вызовы с предопределенными предикатами будут кэшироваться. Многократные вызовы одного метода, который вызывает FindAll с анонимным методом, должны получить кэшированные результаты. Два метода, вызывающих FindAll с явно одним и тем же анонимным методом, не будут предоставлять кешированные результаты, но это должно быть довольно редко.