2010-12-01 2 views
3

어떻게 다음 쿼리를 기능 호출로 변환합니까? 내가 컴파일러가 내부적으로이 작업을 수행 알고 있지만이 경우 결과를LINQ의 열거 형 확장 메서드로 쿼리 이해 이해 번역

 var query = from item in Enumerable.Range(0, 10) 
        from item2 in Enumerable.Range(item, 10) 
        from item3 in Enumerable.Range(item2, 10) 
        select new { item, item2, item3 }; 
+0

"이 특정 쿼리를 메서드 체인으로 변환하는 것이 무엇입니까?"또는 "LINQ 쿼리의 메서드 체인 버전을 어떻게 볼 수 있습니까?"와 같은 일반적인 질문을 묻는 중입니까? ? – AakashM

+0

주로 전 (前者)에 대해 묻지 만 후자 역시 마찬가지입니다. – cordialgerm

+0

후자의 경우 실제로는 대답이 아니지만 ReSharper가 IDE에서 직접 변환을 수행 할 것이라고 제안합니다. – AakashM

답변

6

을 볼 것입니다 방법을 모른다, 그것은 SelectMany를 사용하고, 개념은 기존의 범위 변수를 유지 투명 식별자을했다. 그래서 쿼리가 번역 다음과 같습니다.

var query = Enumerable.Range(0, 10) 
         .SelectMany(item => Enumerable.Range(item, 10), 
            (item, item2) => new { item, item2 }) 
         .SelectMany(z => Enumerable.Range(z.item2, 10), 
            (z, item3) => new { z.item, z.item2, item3 }); 

(이 경우 z 투명 식별자 인 where 절 또는 마지막 from 절 후 select 이외가 있었다면, 또 다른 투명 식별자는했을 것이다 도입되었습니다.)

번역은 모두 C# 언어 사양 섹션 7.16에 설명되어 있습니다.