문제

나는 C#방법는지 조건자<Foo> 목록을 반환합의 일치하는 항목을...

public static List<Foo> FindAll( Predicate<Foo> filter )
{
    ...
}

필터가 종종 중 하나는 일반적인 설정...

public static class FooPredicates
{
    public static readonly Predicate<Foo> IsEligible = ( foo => ...)
    ...
}

...지할 수 있는 익명할 수 있습니다.

나는 지금과 같은 이 방법 캐시 결과 ASP.NET 캐시므로,반복되는 통화와 같은 대리인으로 캐시 결과입니다.이를 위해,나를 만들 필요가 캐시에서 키를 사용할 수 있습니다.을 위임합니다.GetHashCode()생산 현명한 결과 이러한 목적으?은 거기에 몇 가지 다른 구성원의 대리자 나는 찾아야 합니까?당신은 이렇게 할 또 다른 방법으로 완전히?

도움이 되었습니까?

해결책

을 수행하는 당신의 캐싱 작업을 수행할 수 있습 다른 제안을 만들어 사전<Predicate<Foo>목록<Foo>>(정전을 위한 글로벌거나,멤버 필드 그렇지 않으면)를 캐시 결과입니다.실제로 전에 실행 조건자<Foo>해야 합 확인하려면 결과에 이미 존재하는 사전.

일반적인 이름에 대한 이 결정적 기능에 캐싱이라는 메모이 제이션-장:)

이후 C#3.0 추가 lambda 과 약탈의 Func/액션하는 대표단,추가 메모이 제이션 C#는 것은 매우 쉽습니다.

웨스는 다이어 훌륭한 게시물 는 개념을 제공합 C#과 몇 가지 좋은 예입니다.

당신이 원하는 나에게 당신을 보여주는 방법을 이렇게 알려주세요...그렇지 않으면,웨스'post 적합해야 합니다.

에 대한 답변에서 쿼리에 대해 대리인 해시 코드입니다.는 경우 두 개의 대리자가 동일한,d1.GetHashCode()와 같아야 합 d2.GetHashCode()지만,나는 100%습니다.확인할 수 있습니다 이 신속하게 제공하여 메모이 제이션을 이동하는 WriteLine 로 FindAll 방법입니다.이 끝나지 않은 사실이되고,또 다른 옵션은 사용하 Linq.식<Predicate<Foo>>을 매개 변수로 사용할 수 있습니다.는 경우에는 식지 않는 폐쇄 다음 식에는 같은 일이 동일해야합니다.

알려주는 방법이 간다,나는 이에 대한 대답할 수 있습니다.같습니다.

다른 팁

평등 위임 평등은 호출 목록에서 각 호출을보고, 호출 할 방법의 평등을 테스트하고, 방법 목표를 테스트합니다.

이 메소드는 캐시 키의 간단한 부분이지만, 메소드의 대상 (인스턴스를 호출하는 인스턴스 - 인스턴스 메소드를 가정)은 직렬화 가능한 방식으로 캐시가 불가능할 수 있습니다. 특히, 상태를 포착하는 익명 함수의 경우 해당 상태를 포착하기 위해 작성된 중첩 클래스의 인스턴스가됩니다.

이것이 모두 메모리에 있다면, 대의원 자체를 해시 키로 유지하는 것은 괜찮을 것입니다. 그러나 고객이 쓰레기를 수집 할 것으로 예상되는 일부 개체가 매달려 있음을 의미 할 수 있습니다. 이를 데이터베이스로 직렬화 해야하는 경우 더 해증됩니다.

메소드가 캐시 키 (예 : 문자열)를 수락하게 할 수 있습니까? (메모리 캐시가 부적절하다고 가정합니다.)

캐시 된 결과를 사전으로 유지합니다 u003CPredicateu003CFoo> ,목록u003CFoo> > ASP.NET 캐시가 모든 결과를 영원히 캐싱하는 대신 만료를 처리하기를 원하기 때문에 어색합니다. 그렇지 않으면 좋은 해결책입니다. 윌의 사전과 함께 갈 것 같아요 u003CPredicateu003CFoo> , String> ASP.NET 캐시 키에서 사용할 수있는 문자열을 캐시합니다.

일부 초기 테스트에 따르면 대의원 평등은 다른 사람들이 말했듯이 "올바른 일"을 수행하지만, 대의원은 병리학 적으로 도움이되지 않습니다. 반사기가 드러납니다

public override int GetHashCode()
{
    return base.GetType().GetHashCode();
}

그래서 어떤 술어u003CFoo> 동일한 결과를 반환합니다.

저의 나머지 문제는 익명의 대표들에게 평등이 어떻게 작동하는지였습니다. 그런 다음 "동일한 방법으로 호출 된 동일한 방법"은 무엇을 의미합니까? 대의원이 같은 장소에 정의 된 한 참조는 동일합니다. 다른 장소에서 정의 된 동일한 신체를 가진 대표는 그렇지 않습니다.

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을 호출하는 두 가지 방법은 캐시 된 결과를 공유하지 않지만 이는 매우 드물어야합니다.

대의원의 gethashcode 구현이 결정적이며 충돌을 일으키지 않는다면 믿지 않을 것입니다.

다음은 두 가지 아이디어가 있습니다. 먼저, 술어를 키로 사용하여 대의원의 결과를 술어/목록 사전 내에 저장 한 다음 캐시의 단일 키 아래 결과의 전체 사전을 저장하십시오. 나쁜 점은 캐시 항목이 손실되면 캐시 된 결과를 모두 잃는다는 것입니다.

대안은 객체/문자열 사전을 사용하여 모든 Predicates에 대한 모든 키를 저장하고 검색하는 getkey ()를위한 확장 방법을 작성하는 것입니다. 당신은 대의원과 함께 사전에 색인하고 키를 반환하여 찾을 수없는 경우 하나를 만듭니다. 이렇게하면 대의원 당 올바른 키를 받고 있으며 충돌이 없다고 확신합니다. Naiive는 유형 이름 + Guid입니다.

객체의 동일한 인스턴스는 항상 동일한 해시 코드 (.NET에서 gethashCode ()의 요구 사항)을 반환합니다. 귀하의 Predicates가 정적 목록에 있고 매번 재정의하지 않는 경우 키로 사용하는 데 문제가 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top