2010-01-15 1 views
3

작업 수행시 성능을 조사하고 있습니다. 컬렉션에서 항목의 하위 집합을 반복합니다. Linq 쿼리를 사용하여이 컬렉션을 필터링합니다. 그것은 기본적으로 다음과 같습니다Linq "Where"는 Linq "Select"보다 비쌉니까?

var filteredItems = items.Where(x => x.PropertyToFilterOn == filterValue); 
foreach (var filteredItem in filteredItems) 
{ 
    // do something to the filtered item 
} 

내가 같은 일을 달성하는 대신 WhereSelect를 사용하는 경우. 어느 것을 사용하는 것이 더 좋으며 차이점은 무엇입니까?

+1

문제는 선택 및 그 같은 일을 달성, 그러나 그것은 사실이 아니다, 그래서 성능의 문제는 이론에 불과하다는 가정에 기초한다. – Guffa

+0

이 질문을 게시하기 전에 제 사실을 바로 알려야합니다. 답변 및 의견에 사과와 감사합니다. – Corpsekicker

답변

9

여기서 Select는 확실히 동일한 것을 이루지 못합니다.

Where은 술어를 기반으로하여 열거 형을 필터링합니다. IEnumerable<T>에있는 Where를 호출 한 결과는 IEnumerable<T>입니다.

Select은 투영입니다. 예를 들어 열거 형의 속성 집합 만 선택하거나 열거 형의 값을 기반으로 다른 개체를 완전히 구성 할 수 있도록 열거 형을 매핑 할 수 있습니다.

여기서 where 및 select는 적어도 O (n) 이상입니다. 열거 형의 각 항목을 방문하여 프로젝션이나 필터를 수행해야하기 때문에.

표준 쿼리 연산자에 대한 다음 문서는 훌륭한 참고 자료입니다.

http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/standard_query_operators.doc

5

Where 필터, Select 맵. 완전히 다른 두 가지.

+0

실제로 그 질문에는 대답하지 않습니다. – Joey

+4

@Johannes : 문제가 잘못된 것을 주장합니다. 본질적으로 질문을 무효로 표시하여이를 수정합니다. 네, 아마 코멘트 일 것입니다,하지만 완전히 잘못된 대답은 아닙니다. – cjk

+2

@Johannes : 그렇지 않습니까? 차이점은 서로 다른 일을한다는 것인데, 실제로 사용하는 것이 더 나은 것은 실제로 원하는 것을 수행하는 것입니다. – Guffa

2

이론의 배경 코드가 어떻게 작동하는지 비교 :

// Where 
foreach(var x in items) 
{ 
    if (x.PropertyToFilterOn == filterValue) 
     yield return x; 
} 

// Select 
foreach (var x in items) 
{ 
    yield return selector(x); 
} 

그래서 당신 마음, 성능 차이는 지정된 셀렉터에 위임의 복잡성을 기반으로합니다. 그러나 다른 사람들이 말했듯이, 그들은 다른 목적을 가지고 있습니다.