2009-07-15 7 views
7

Expression<Func<T>> 또는 Func<T>을 사전의 키로 사용하면 효과가 있습니까? 예를 들어 계산량이 많은 결과를 캐시하는 경우.C# : 표현식이나 함수를 사전의 키로 사용할 수 있습니까?

public static class Cache<T> 
{ 
    // Alternatively using Expression<Func<T>> instead 
    private static Dictionary<Func<T>, T> cache; 
    static Cache() 
    { 
     cache = new Dictionary<Func<T>, T>(); 
    } 
    public static T GetResult(Func<T> f) 
    { 
     if (cache.ContainsKey(f)) 
      return cache[f]; 

     return cache[f] = f(); 
    } 
} 

이도 작동합니다 : 예를 들어

, 광산의 different question에서 조금 내 아주 기본적인 캐시를 변경?

편집 : 빠른 테스트 후 실제로 작동하는 것처럼 보입니다. 하지만 흠 ... 지금 ... 그 그래도 일어나지 않을 것이다 있도록 변경하는 방법을 잘 반환 형식 당 하나의 캐시 것 때문에 아마, 더 일반적인 될 수 있다는 것을 발견

편집 2 : 누오, 잠깐 ... 사실은 그렇지 않습니다. 글쎄, 일반적인 방법을 위해. 하지만 람다는 아닙니다. 그들은 똑같이 보더라도 다양한 랜덤 메서드 이름을 얻습니다.), "다 잘 아

+2

왜 그런가요? –

+0

나는 그렇지 않다. 나는 다른 질문에 캐시 물건을 알아내는 동안 생각에 비틀 거리고 호기심이 생겼다. – Svish

+0

조사 호기심에 대한 보너스 포인트이지만 실제로이 기술에 대한 실제 응용 프로그램을 볼 수는 없다. 반면에 효과가 있었다면 아이디어는 높은 쿨 팩터를가집니다. –

답변

3

그들은을 위해 설계되지 않기 때문에 키로 위임을 사용하는 것을 권장하지 당신은 그조차 대리인 인. 오래가 인스턴스이기 때문에, 모든 유형의 개체를 사용할 수 있습니다,하지만 난 을 독립적으로 만든 대리자가 동일한 해시 코드를 생성하는지, 심지어 비교할 수있는 경우 (동등한 것)에 대해서는 확신 할 수 없습니다.

+0

대표자가 키와 관련하여 제대로 작동하지 않는 것 같습니다./ – Svish

+0

대표단은 "구조적으로"가 아니라 참조로 비교합니다. 즉, 동일한 코드를 호출하지만 다른 인스턴스 인 두 대표는 동일하지 않은 것으로 비교합니다. –

+0

@Eric Lippert : "구조체"가 무의미하게 비교할 때, 자연스러운 폴백 메커니즘이라고 생각했습니다. –

0

동적 언어 런타임 (IronPython 등)을 사용하면 스트레칭이 가능합니다. 사전에서 임의의 코드 스 니펫을 확실히 실행할 수 있습니다.

그런 다음 필요에 따라 코드를 실행하고 처음으로 결과를 캐시하면 d 이후의 모든 호출에 대해 캐시 된 결과를 사용하십시오.

많은 계산을 수행했다면,이 작업이 꽤 성공적 일 것이라고 확신합니다. 그것은 모든 상황이지만, 나는 당신이 달성하고자하는 것을 정확히 모르겠습니다. :)