2012-07-18 3 views
2

게으른 평가가 linq Max 연산자와 어떤 관련이 있는지 이해하는 데 어려움이 있습니다. linq 최대 게으른 평가

내 코드입니다 :

 var someList = new List<someType> 
     { 
      new someType { decimalValue = 32 } 
     }; 

line1: var valA = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;

line2: var valB = someList.Any() ? someList.Max(s => s.decimalValue) : 0.0M;

line3: var valC = valB;

나는 다음과 같은 동작을 볼 수있는 코드를 단계별로 : L 후

에게 valB 표시 대상을 수행 valA = 0, valB = 0, valC = 0

valAvalB 후의 값을 표시 않는 이유 valA = 32, valB = 32, valC = 32

가 할당 valA = 32, valB = 0, valC = 0 라인 (3)이 실행되면

, 라인 (2)가 실행되면

, 왜 오프라인 실행 한 1 한 번 값 valC이 할당 되었습니까?

다음은 제 디버거의 스크린 샷입니다. 내 IDE에 대해 비표준적인 것이 있어야 할 것 같아.

IDE image http://toastermagic.co.uk/images/linqMax.png

+1

'Any'또는 'Max'가 즉시 실행됩니다. –

+0

@TimSchmelter * 두 개의 *가 즉시 실행됩니다 ('Any'의 다른 오버로드가 지연 되더라도). – Servy

+0

@Servy : 그것이 내가 말한 것입니다. 그 외에는 과부하가 연기됩니다. [** It **] (http://msdn.microsoft.com/en-us/library/bb534972.aspx)도 즉시 실행됩니다. 'foreach'에서 술어를 사용하고 요소 중 하나라도 true를 반환하면 true를 반환하고 그렇지 않으면 false를 반환합니다. –

답변

1

Max 연산자는 전혀 지연되지 않고, 즉시 실행한다. 당신이보고있는 것은 디버거의 정상적인 동작입니다. 강조 표시된 행이있을 때 "이 행을 실행했습니다."가 아니라 "이 행을 실행하려고합니다"를 의미합니다. 주어진 코드 행의 결과를 보려면 항상 '다음'행에 있어야합니다.

당신이 이것을 고려한 것으로 보입니다. 모든 변경 사항 (LINQ에만 국한되어서는 안됨)을 보았으므로 라인이 늦어 져서 소스 코드와 실행 파일이 동기화되지 않은 것일 수 있습니다. 당신은 솔루션의 깨끗한 다시 bulid해야하고 모든 것이 잘되어야합니다. 나는 빌드에서 올바르게 선택되지 않은 소스 코드를 약간 수정했기 때문에 소스 코드 대 실행 파일의 행 번호가 각각 하나씩 떨어져 있다고 생각합니다.

만약 정말로 뭔가 잘못 되었다면,이 문제의 원인이되는 파일이나 설정이 손상되거나 파괴되지 않도록 코드베이스가 충분히 작 으면 코드를 완전히 새로운 프로젝트로 옮길 수 있습니다 .

+0

IDE에서 코드를 단계별로 실행하는 방법을 알고 있습니다. 편집에서 추가 한 다이어그램 – paul

+0

@paul 편집을 참조하십시오. – Servy

+0

생각했지만 그랬지만 다시 작성한 솔루션은 여전히 ​​동일합니다. – paul

0

은 복제 할 수 없습니다

static void Main(string[] args) 
    { 
     var data = (from n in Enumerable.Range(0, 10) 
        select new { value = (decimal)n }) 
        .ToList(); 

     var valA = data.Any() ? data.Max(s => s.value) : 0.0M; 
     Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, 0, 0); 

     var valB = data.Any() ? data.Max(s => s.value) : 0.0M; 
     Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, valB, 0); 

     var valC = valB; 
     Console.WriteLine("A = {0}, B = {1}, C = {2}", valA, valB, valC); 

     Console.ReadLine(); 
    } 

작품을 예상대로.

디버거를 잘못 읽은 것 같습니다.

관련 문제