<p>I have a C# method which accepts a Predicate&lt;Foo&gt; and returns a list of matching items...</p>

<pre><code>public static List&lt;Foo&gt; FindAll( Predicate&lt;Foo&gt; filter )
{
    ...
}
</code></pre>

<p>The filter will often be one of a common set...</p>

<pre><code>public static class FooPredicates
{
    public static readonly Predicate&lt;Foo&gt; IsEligible = ( foo =&gt; ...)
    ...
}
</code></pre>

<p>...but may be an anonymous delegate.</p>

<p>I'd now like to have this method cache its results in the ASP.NET cache, so repeated calls with the same delegate just return the cached result. For this, I need to create a cache key from the delegate. Will Delegate.GetHashCode() produce sensible results for this purpose? Is there some other member of Delegate that I should look at? Would you do this another way entirely?</p>

Delegate equality looks at each invocation in the invocation list, testing for equality of method to be invoked, and target of method.
The method is a simple piece of the cache key, but the target of the method (the instance to call it on - assuming an instance method) could be impossible to cache in a serializable way. In particular, for anonymous functions which capture state, it will be an instance of a nested class created to capture that state.
If this is all in memory, just keeping the delegate itself as the hash key will be okay - although it may mean that some objects which clients would expect to be garbage collected hang around. If you need to serialize this to a database, it gets hairier.
Could you make your method accept a cache key (e.g. a string) as well? (That's assuming an in memory cache is inadequate.)