キャッシュされた結果を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を呼び出す1つのメソッドを複数回呼び出すと、キャッシュされた結果が得られます。明らかに同じ匿名メソッドでFindAllを呼び出す2つのメソッドは、キャッシュされた結果を共有しませんが、これはかなりまれなはずです。