ste*_*son 7 .net c# asp.net delegates memoization
我有一个C#方法接受Predicate <Foo>并返回匹配项列表...
public static List<Foo> FindAll( Predicate<Foo> filter )
{
...
}
Run Code Online (Sandbox Code Playgroud)
过滤器通常是常见的一套......
public static class FooPredicates
{
public static readonly Predicate<Foo> IsEligible = ( foo => ...)
...
}
Run Code Online (Sandbox Code Playgroud)
......但可能是匿名代表.
我现在想让这个方法将其结果缓存在ASP.NET缓存中,因此使用相同委托的重复调用只返回缓存的结果.为此,我需要从委托创建一个缓存键.Delegate.GetHashCode()会为此目的产生明智的结果吗?我应该看一下代表团的其他成员吗?你会完全采用另一种方式吗?
要执行缓存任务,您可以遵循其他建议并创建一个用于缓存结果的 Dictionary<Predicate<Foo>,List<Foo>> (全局静态,否则为成员字段)。在实际执行 Predicate<Foo> 之前,您需要检查结果是否已存在于字典中。
这种确定性函数缓存的通用名称称为记忆化 - 非常棒:)
自从 C# 3.0 添加了 lambda 和 Func/Action 委托之后,向 C# 添加 Memoization 就非常容易了。
Wes Dyer 发表了一篇很棒的文章,通过一些很棒的示例将这一概念引入了 C#。
如果您想让我向您展示如何做到这一点,请告诉我......否则,韦斯的帖子应该足够了。
回答您有关委托哈希码的查询。如果两个委托相同,则 d1.GetHashCode() 应该等于 d2.GetHashCode(),但我对此并不是 100%。您可以通过尝试 Memoization 并将 WriteLine 添加到 FindAll 方法中来快速检查这一点。如果这最终不成立,另一个选择是使用 Linq.Expression<Predicate<Foo>> 作为参数。如果表达式不是闭包,则执行相同操作的表达式应该相等。
让我知道这是怎么回事,我有兴趣知道有关 delegate.Equals 的答案。