2010-03-11 3 views
2

이 두 문 중 더 빠르고 더 나은 방법은 무엇입니까?Linq 메서드 본부 모범 사례 질문

myList.Where(x => 
      { 
       bool itemOne= x.ItemOne == paramItemOne; 
       bool itemTwo = x.ItemTwo == paramItemTwo; 
       return itemOne && itemTwo; 
      }) 


myList.Where(x => x.ItemOne == paramItemOne).Where(x=>x.ItemTwo == paramItemTwo) 

또는 동일합니까?

답변

7

나는 말할 것도 없습니다. 가장 빠른이 될 것입니다 :

myList.Where(x => x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo) 

이 훨씬 더 많은 방법을 포함 할 수 있기 때문에

이 두 번째 형태는 느려집니다 (당신의 첫번째 형태로 변수 할당을 최적화 할 않는 컴파일러/JIT를 가정) Where 문에 제공된 대리자에 대한 호출.

+1

컴파일러는 첫 번째 양식에서 두 번째 부울을 최적화 할 수 없습니다. 부작용은 제거됩니다. – SLaks

0

성능은 동일하거나 매우 비슷합니다. 두 번째 메소드 오버 헤드가 더 많을 수 있습니다.

성능보다 더 중요한 것은, 나는 그것이 훨씬 더 명확 때문에 첫 번째 더 나은 방법입니다 말할 것입니다.

1

결과는 내가 대신을 작성하는 방법을 권하고 싶습니다, 그러나 동일이 보장되는

myList.Where(x => 
      { 
       return x.ItemOne == paramItemOne && x.ItemTwo == paramItemTwo; 
      }); 

빨리 일을 지금 x.ItemTwo == paramItemTwo도 계산되지 않기 때문에 x.ItemOne == paramItemOne

+0

음 ... 두 조건이 모두 포화되어야하므로 최종 어설 션이 유지되지 않습니다. 두 술어 모두 AND로 평가되어 참으로 평가되어야합니다. 그러나 x.ItemOne! = paramItemOne의 경우 두 번째 조건자를 평가하지 않지만 Where(). Where() 양식에서도 마찬가지입니다. 첫 번째 Where 문으로 필터링 된 항목은 두 번째 Where가 실행되는 열거 형입니다. – spender

0

경우 첫 번째 항목은 목록 항목별로 두 조건을 모두 확인합니다. 두 번째는 첫 번째 조건으로 필터링 한 다음 두 번째 조건으로 결과를 필터링합니다.

둘째는 다른 임시 컬렉션을 만들고 채우지 만 두 번째 조건은 비교 대상이 적습니다.