将缓存的结果保存在 Dictionary<Predicate<Foo>,List<Foo>> 对我来说很尴尬,因为我希望 ASP.NET 缓存为我处理到期而不是永远缓存所有结果,但这是一个很好的解决方案。我想我最终会使用 Will 的 Dictionary<Predicate<Foo>,string> 来缓存我可以在 ASP.NET 缓存键中使用的字符串。
一些初步测试表明,委托平等做了其他人所说的“正确的事情”,但 Delegate.GetHashCode 在病态上没有帮助。反光板揭示
public override int GetHashCode()
{
return base.GetType().GetHashCode();
}
所以任何 Predicate<Foo> 返回相同的结果。
我剩下的问题是匿名代表如何实现平等。那么“在同一个目标上调用相同的方法”是什么意思呢?似乎只要在同一个地方定义了委托,引用就相等。在不同地方定义的具有相同主体的代表不是。
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 的两个方法不会共享缓存的结果,但这应该是相当罕见的。