2010-12-26 3 views
0

나는 두 조건의 평등을 결정하기 위해 노력하고있어 :C# 술어 매개 변수 내의 값을 검사하는 방법? - 결정 술어 평등

public T FirstOrDefault(Func<T, bool> predicate) 
{ 
    if (EntityCache.ContainsKey(predicate.GetHashCode())) 
     return EntityCache[predicate.GetHashCode()]; 
    else 
    { 
     var entity = _objectSet.FirstOrDefault<T>(predicate); 
     EntityCache.Add(predicate.GetHashCode(), entity); 
     return entity; 
    } 
} 

난 데 문제는, 그 안에 사용되는 값을 고려하지 않는 술어의 해시 코드이며, 내가 그들을 검색하는 방법에 대해 잘 모르겠습니다.

예를 들어 위에 나온 메소드에 전달 된 조건문은 다음과 같습니다. (r => r.Id == id) FirstOrDefault 메소드에서 'id'값을 찾는 방법은 무엇입니까?

+0

왜 당신이 원하는 않는 사용하는 것이 좋을 것이다 있습니다

EntityCache에서 그와 함께 대표단에 전달 된 값을 유지하고있다 에? 'Func '을 사용하는 구문의 요점은 어떻게 구현되는지 전혀 모른다는 것입니다. 메소드의 * 사용자 *가 결과를 필터링하는 방법을 아는 것은 FirstOrDefault의 * 구현 자 *가 당신에게 달려 있습니다. 그것들은'Id' 속성을 사용하기로 선택하거나 완전히 다른 술어를 가질 수도 있습니다. 그것이 가치있는 것을 위해, 당신은'Func '을 가져 와서 그들이 pk를 리턴한다고 가정하고, 당신은'T'의 현재 인스턴스에 대한 값을 얻기 위해 술어를 호출 할 수 있습니다. –

+0

그 대답은 다음과 같이 쉽게 할 수있는 방법이 없다는 것입니다. 어떤 술어를 전달하는 유연성을 유지하고 그 술어와 값 집합이 이전에 전달 된 것과 동일한지를 결정할 수 있기를 원하기 때문입니다. – BrooklynDev

답변

0

표현식을 사용해야합니다. 그것들은 func 's를 포함하고 있지만, 그들은 또한 구문 트리를 포함하고 있으며 런타임에 그들의 '소스 코드'를 검사 할 수 있습니다.

+0

그러나 나는이 일을하는 방식이 아직도 악취가 나지 않는다는 것을 인정해야한다. 예를 들어 필드 이름과 필드 값을 캡슐화하는 고유 한 클래스를 만듭니다. 새 QueryFilter ("Id", 12)와 같습니다. 이것은 훨씬 더 나은 디자인으로 이어질 것입니다. – fejesjoco

+0

그 방법에 원하는 술어를 전달할 수있는 유연성을 유지하고 싶지만 그 술어와 매개 변수 값 집합이 이전에 전달되었는지 여부를 어떻게 든 결정하려고합니다. – BrooklynDev

+0

제 제안은 어떤 식 으로든 당신을 제한하지 않습니다, 당신은 필터 표현 파생물의 집합을 만들 수 있습니다. param 유형이 인 추상 필터 기본 클래스를 만듭니다.이 클래스에는 bool DoesItMatch (T elem)라는 단일 메서드가 있습니다. 그런 다음 생성자 매개 변수로 속성 이름과 값을 사용하는 SimpleFilterExpression 을 파생시킵니다. 그런 다음 다른 파생 클래스를 자유롭게 추가하십시오. 그런 다음 모든 클래스가 GetHashCode 및 Equals를 제공하는지 확인하십시오. 이러한 간단한 구현 클래스가 있으므로 매우 간단합니다. – fejesjoco

0

올바르게 이해하면 대리자 내에서 캡처 한 변수의 값을 확인하려고합니다. 이 작업을 쉽게 수행 할 수있는 방법이 없다는 것이 확실합니다. 대리자 대신 표현식 트리를 사용하면 간단 할 것 같습니다. 또 다른 옵션 (아마도 훨씬 더 간단) 또한 대신

if (EntityCache.ContainsKey(predicate.GetHashCode())) 
    return EntityCache[predicate.GetHashCode()]; 

TryGetValue

+0

TryGetValue 팁 주셔서 감사합니다. – BrooklynDev

+0

NONONONO, -1. 해시 코드가 (비둘기 원칙) – erikkallen

+0

입니다. @erikkallen 당신은 절대적으로 옳습니다 (나는 해쉬 코드를 사용하고 있다는 것을 눈치 채지 못했습니다).하지만 그것이 내 객체와 무슨 상관이 있습니까? 대답 ?나는 단지'If contains return []'패턴이'TryGetValue' 메서드로 더 잘 구현된다는 것을 지적하고있었습니다. 그리고 그것은 내 대답의 핵심을 제쳐 놓고 ... –