2013-02-09 3 views
2

은 거의 알고는 불가능하고 무의미하지만, 단지 배우려고 .. 내가 가진 :두 개의 별도 반복자 블록을 결합 할 수있는 방법이 있습니까?

public IEnumerable<IEnumerable<object>> GetMany() 
{ 
    while (someCondition) 
     yield return GetFew(); 
} 

static IEnumerable<object> GetFew() 
{ 
    while (someOtherCondition) 
     yield return new object(); 
} 

나는 두와 형태로 하나의 방법을 결합 할 수 있나요? 두 개의 다른 반복자 블록이 한 가지 방법으로 거짓말을 할 수 있습니까?

편집 : 나는 현재 가지고있는 문제를 해결하는 방법을 묻지 않습니다. 나는 새로운 것을 배우려고 노력하고 있습니다. 그래서 더 큰 질문은 "하나의 기능에서 두 개의 분리 된 블록이 작동 할 수있는 방법이 있습니다"라는 것입니다. C#에서는 익명 형식과 클로저가 있기 때문에 명명 된 형식이나 메서드없이 메서드 자체 내에 새로운 무언가를 정의 할 수 있습니다. 마찬가지로 블록?

+0

자세한 내용을 제공해 주실 수 있습니까? 무엇을하고 싶니? SelectMany Union을보십시오. – gabba

+0

나는 할 일이 없다. 그리고 확실히 저는 두 블록으로 살 수 있습니다. 실수로 한 메서드에서 코드를 작성한 후 컴파일 할 때 두 가지 메서드를 리팩토링해야 할 때를 배우려고합니다. 내가 그것에 대해 생각했을 때. – nawfal

답변

1

당신이 요구하는 것은 익명의 반복자 블록입니다. 에릭 리 퍼트 blogged on the subject. 간단히 말해서, 그는보고 싶어하는 멋진 기능이지만, 실제로 그러한 기능을 구현하는 것은 매우 어렵 기 때문에 지금까지 언어에 추가되지 않았습니다. (앞으로 추가 할 예정입니다. 있을 것 같지 않게).

+2

어려움은 매우 까다로운 기능 일뿐만 아니라 기존 아키텍처 위에 구현하는 것이 많은 작업이었을 것입니다. 이전에 반복기가 없었던 VB는 반복기 블록을 추가하고 익명 반복기를 추가했습니다. 개선 된 Roslyn 아키텍처를 사용하면 가상의 차기 버전의 C#에서이 기능이 더 저렴 해지기를 바랍니다. –

+1

(C# 5에서는 비동기 메서드와 비동기 람다를 모두 추가했음을 알 수 있습니다.) –

3

즉, 같은 방법으로 반복자를 yield 중첩 할 수 없습니다.

yield은 메소드 수준에서 컴파일됩니다. yield return을 수행 할 때마다 메소드가 종료되고 나중에 중단 된 부분부터 계속됩니다. 즉, yield 문을 중첩하면 해당 문은 블록 수준이 아닌 메서드 수준에서 계속 작동합니다.

관련 문제