2009-08-01 2 views
42

Expression<Func<T, bool>>을 매개 변수로 사용하는 방법이 있습니다. List.Find() 메서드에서 술어로 사용하고 싶습니다. 그러나 List를 취하는 술어로 변환 할 수 없습니다. 이 작업을 수행하는 간단한 방법을 알고 있습니까?식 <Func <T, bool>>을 술부로 변환하는 방법 <T>

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    var predicate = [what goes here to convert expression?]; 

    return list.Find(predicate); 
} 

tvanfosson 및 280Z28 답변을 결합 업데이트

, 지금이 사용하고 있습니다 :

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new() 
{ 
    var list = GetList<T>(); 

    return list.Where(expression.Compile()).ToList(); 
} 

답변

46
Func<T, bool> func = expression.Compile(); 
Predicate<T> pred = t => func(t); 

편집 : 코멘트 당 우리는 두 번째위한 더 나은 답변을 줄 :

Predicate<T> pred = func.Invoke; 
+0

완벽한 같은 IL를 생성

Func<T, bool> func = expression.Compile(); Predicate<T> predicate = new Predicate<T>(func); 

! 감사! –

+7

또는 : pred = func.Invoke; –

+0

그래, func.Invoke가 더 좋아 보인다. –

25

이 방법이 필요하지 않습니다. Where()를 사용하십시오.

var sublist = list.Where(expression.Compile()).ToList(); 

또는 더 좋게 표현식을 람다 인라인으로 정의하십시오. 언급되지 않은

var sublist = list.Where(l => l.ID == id).ToList(); 
+1

사실입니다. 그것이 좁은 독서를 위해 얻는 것입니다. –

+0

Find() 대신 Where()를 사용하면 필요한 작업입니다. 그러나 첫 번째 예제에서는 그냥 expression 대신 expression.Compile()을 사용해야합니다. 감사. –

+0

업데이트 됨. 나는 Func가 어디서 나왔는지 사실을 무시했다. . – tvanfosson

22

또 다른 옵션 :이

Func<T, bool> func = expression.Compile(); 
Predicate<T> predicate = func.Invoke; 
+4

이것은 왜 12 표 밖에 없습니까? 너 감사하지 않은 농부 야! 그것은 존 스켓 (Jon Skeet)입니다. 그의 말에주의해라! !!! – jokab