2010-02-10 5 views
3

2006 년에 C#을 배웠고 최근에 다시 시도했습니다. 나는 C# 3.0에 LINQ Extensions라는 것을 추가했다고 배웠습니다. 이제 확장 메서드에 익숙합니다. IEnumerables와 관련된 세부 사항을 숙고하고 있습니다.LINQ 확장은 다른 확장 기능과 어떻게 연결됩니까

이전

오늘, 저와 제 동료 중 하나는 코드의 다음 블록은 동일했다 여부를 토론했다 : 그는 최근이 있기 때문에보다 효율적인 하더군요

List<int> integers; 
IEnumerable<int> subResult = items.Where(i => IsPrime(i)); 
IEnumerable<int> orderedResult = subResult.OrderBy(i => i); 

List<int> integers; 
IEnumerable<int> result = items.Where(i => IsPrime(i)).OrderBy(i => i); 

대 확장 기능은 소스의 늦은 질의를 사용했습니다. 나는 그가 의미하는 바를 잘 이해하지 못했으며, 그가 옳은지 궁금해하고있었습니다.

답변

5

등가입니다. 이들은 모두 지연 평가/후기 쿼리를 사용합니다.

이 의미는 .Where 메서드가 호출 될 때 목록의 실제 열거를 수행하지 않고 해당 입력에 대한 참조 및 해당 조건을 검사하고 저장하는 조건을 유지한다는 것을 의미합니다. .Where의 결과에서 GetEnumerator 메서드를 나중에 호출하면 .Where이 작동합니다.

.OrderBy과 같은 것. .GetEnumerator이 호출 될 때까지 실제로 목록의 열거를 수행하지 않습니다.

이 내용은 이해하기 어려울 수 있지만 실제로 배우기에는 몇 가지 좋은 방법이 있습니다. 첫 번째는 간단한 예제를 작성하는 것입니다. 여러 줄로 나눠서 모든 항목을 반복하는 간단한 for-each 루프를 사용하는 것이 좋습니다. 코드를 디버깅하고 줄 단위로 단계별로 진행하십시오. 디버거가 어떻게 뛰어 오르는 지보십시오. 처음에는 매우 혼란 스럽지만 몇 번 실행하면 게으른 평가가 작동하는 방식을 이해할 수 있습니다.

Jon Skeet에는 LINQ를 시각화하기위한 멋진 데모가 있습니다.

https://msmvps.com/blogs/jon_skeet/archive/2008/02/20/visual-linq-watch-query-expressions-as-they-happen.aspx

3

그가 잘못되었습니다.

두 코드 블록은 동일합니다.
실제로 다른 곳에서는 subResult을 사용하지 않으면 릴리스 모드에서 정확히 동일한 IL로 컴파일해야합니다.

1

LINQ는 IEnumerable에서 확장 메서드로 구현됩니다. LINQ 쿼리로 작업하는 것을 2 단계 프로세스로 생각할 수 있습니다. 먼저 쿼리를 정의한 다음 쿼리를 반복합니다. 실제로 쿼리를 반복하는 두 번째 단계까지는 아직 실행되지 않았습니다.

두 예제는 기능적으로 동일하고 결과를 반복 할 때까지 그들 중 어느 것도 실제로 어떤 순간 모두 LINQ 쿼리 연산자 (WhereOrderBy)에서 궁극적으로 다른과 자신의 적절한 열거 결과를 반환 실행할 쿼리를 실행합니다 , 반복을 수행하는 코드.

0

지연된 실행 및 확장 방법은 완전히 분리 된 개념이다.확장 메서드 구문없이

:

var result = System.Linq.Enumerable.Where(
    myList, a => a.CustomerName == "Bob"); 

확장 방법으로는, myList에은 (는 아니지만 않습니다)는 어디 방법이 나타납니다.

var result = myList.Where(a => a.CustomerName == "Bob"); 
관련 문제