2010-03-24 2 views
9

, 나는 어디에서 진술 할 수있는 두 가지 방법 중 하나를Linq Where 절 - 스택하거나 결합하는 것이 더 낫습니까? LINQ하는 방법 체인을 작성할 때

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir") 

또는

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir") 

는 다른 통해 하나의 어떤 혜택이 있습니까?

이 예제의 데이터 유형에 대해 너무 많이 걱정하지 않아도되지만 데이터 유형에 문제가있는 경우 잘 알고있는 것이 좋습니다.

명백한 사실은 객체가 이미 참조되었으므로 응용 프로그램에서 한 번에 두 개의 속성이 더 쉽다는 것입니다. 맞습니까?

+0

혜택에 대해 물어 보면 성능, 해독 성 또는 다른 것을 언급하고 있습니까? – Kane

+0

가독성을 제외한 모든 이점은 모두 POV에서 상당히 읽을 수 있으므로 – Dann

답변

3

귀하의 예에서 그들은 동일하고 개인적인 취향의 문제입니다. 지연된 LINQ 실행으로 인해 컬렉션은 한 번만 반복됩니다.

또는 연산자를 사용하여 표현식을 결합하려는 경우 첫 번째 표현식 만 사용할 수 있습니다.

+0

LINQ가 그런 식으로 작동했음을 알지 못했습니다. 나는 첫 번째가 결합 된 비교로 인해 가장 빠를 것이라고 생각했다. 해피 나는 지금이 질문을 올린다. – Dann

0

오버 헤드가 다소 줄어들면 약간 더 빠릅니다. 그 외에는 기본적으로 같은 방식으로 처리됩니다.

그러나 주목할만한 차이점은 Color 속성이 두 번째 예의 Age 속성보다 먼저 비교된다는 것입니다. 합니다 ( Color 속성에만 Age 비교가 참 항목에 대해 비교되도록)이 단락에 싼 비해 좀 더 비싼를 원하는 경우에, 당신은 마지막 Where 호출 한 싼를 넣어해야합니다

var blackOldCats = 
    cats 
    .Where(cat => cat.Colour == "noir") 
    .Where(cat => cat.Age > 7); 

이 경우에는 비교 비용에 별다른 차이가 없지만 하나가 다른 것보다 훨씬 비싼 경우 어떤 순서로 평가되는지 알면 좋습니다.

+2

앞쪽이 아닌 뒤쪽에 싼 비교표를 붙이는 이유를 설명해 주시겠습니까? 나는 다른 방법으로 라운드를 할 것이지만, 본능에 의해서만, 좋은 이유가 있습니다. =) – Jens

+1

필자는 여기에 본능을 확인하는 작은 테스트 응용 프로그램을 작성했습니다 (두 개의 절, 하나는 짧은 Thread.Sleep, 다른 하나는 빠름). 이전 호출의 결과에 따라 호출이 실행되는 것으로 보이는 모든 곳에서 싼 비교가 첫 번째 호출이어야합니다. 내가 실수를 했니? – Jens

+0

Jens가 맞습니다. 진술은 거꾸로되어 있습니다. 난 그냥 그 방법을 때뿐만 아니라 자사의 히트와 메서드는 순서대로, 왼쪽에서 오른쪽으로 실행 콘솔에 대한 권리와 함께 그것을 테스트했습니다 – Dann