2010-08-06 2 views
1

이 코드를 감안할 때. Func에 min의 값을 열심히 바인드하려면 어떻게해야합니까? 변수 min을 다시 계산하지 않으시겠습니까?Linq에 Func을/표현 현지 평가

설명 : 서명을 변경하고 싶지 않습니다. 표현식 트리가 min을 변수로 사용하지 않고 상수 표현으로 사용하기를 바랍니다. 트리의 변수 평가 대신 상수 표현식을 갖도록 min의 평가를 변환 할 여지가 있습니까? 당신은 그것을 매개 변수 수 있도록해야 할 것입니다

int min = 0; 
    int staticMin = min; 
    Func<List<IUser>, bool> ulContainsJohn = 
       l => l.Where(u => u.FirstName == "John").Count() > staticMin ; 
+0

이유는 무엇입니까? 표현 트리를 구문 분석하려고합니까? – SLaks

+0

당신은 역설을 가지고 있습니다 ... 당신은 상수 표현을 원하지만 당신의 시험은 그것을 바꿀 것입니까? – Nix

+0

함수 ulContainsJohn 내에서 상수 표현식으로 min bound 값을 원합니다. 분이 변경 될 수있는 경우, 함수 내에서 바인드 된 값은 변경되지 않아야합니다. 그게 지금 말이 되니? – Shlomo

답변

1

편집 : 의견을 읽고 함수 작성자에게 문의하십시오.

Func<int, Func<List<IUser>, bool>> createFn = (min) => 
    (l) => (l.Count(u => u.FirstName == "John") > min); 

Func<List<IUser>, bool>> contains0 = createFn(0); 

Assert.AreEqual(true, contains0(userList)); 

Func<List<IUser>, bool>> contains3 = createFn(3); 

Assert.AreEqual(true, contains3(userList)); 

1 요소 배열을 사용해보십시오. 추악하지만 작동합니다.

var values = new int[] { 0 }; 

Expression<Func<List<IUser>, bool>> ulContainsJohn = 
       (l => l.Where(u => u.FirstName == "John").Count() > values[0]); 

Assert.AreEqual(true, ulContainsJohn.Compile()(userList)); 

values[0] = 3; 

Assert.AreEqual(true, ulContainsJohn.Compile()(userList)); 

또 다른 옵션, 더 나은 :

private int Minimum { get; set; } 

... 

Expression<Func<List<IUser>, bool>> ulContainsJohn = 
      (l => l.Where(u => u.FirstName == "John").Count() > Minimum); 

Func<List<IUser>, bool> fn = ulContainsJohn.Compile(); 
Assert.AreEqual(true, fn(userList)); 

Minimum = 3; 

Assert.AreEqual(true, fn(userList)); 
+0

충분히 닫으십시오. 나는 표정 나무가 필요해. 고마워. – Shlomo

0

가장 간단한 해결 방법은 별도의 변수를 확인하는 것입니다.

Expression<Func<List<IUser>, int, bool>> ulContainsJohn = 
       (List<IUser> l, int min) => (l.Where(u => u.FirstName == "John").Count() > min); 


    ulContainsJohn.Compile()(userList, min); 
+0

내가 추가 한 설명을 참조하십시오 ... – Shlomo

1

:

+0

서명을 변경할 수 없습니다. 추가 한 설명을 참조하십시오. 그래도 좋은 생각. – Shlomo

+0

왜 카운트를 반환하지 않습니까? – Nix