2017-12-27 2 views
3
public static IEnumerable<T> Pipe<T>(this IEnumerable<T> source, Action<T> action) 
{  
    return _(); IEnumerable <T> _() 
    { 
     foreach (var element in source) 
     { 
      action(element); 
      yield return element; 
     } 
    } 
} 

내가 MoreLinq의 환매 특약이 코드를 발견하고이 줄을 이해할 수 없다 :누구나이 열거 자 구문을 설명 할 수 있습니까?

return _(); IEnumerable <T> _() 
+4

두 줄로 (세미콜론 다음에) 분할하고,'_'의 모든 항목을'enumerate'로 바꿉니다. –

+4

@KevinGosse - C#으로 속도를 높이 지 못하더라도 즉시 취소 할 수 없습니다. 7 ([Local functions] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/local-functions) –

+1

고마워요! 그러나 그 때의 요점은 무엇입니까? '수익률 반환'으로 'foreach'를 수행 할 수 없습니까? –

답변

5

이 코드는 C#을 상대적으로 새로운 기능을 사용 local function을했다. 이 함수의 유일한 예외는 그 이름입니다. 개발자는 단일 밑줄을 사용했습니다. 따라서, 함수의 이름이 _, 그래서 호출은 다음과 같습니다 : 당신이 return_라는 로컬 함수를 호출의 결과를 반환 것을 알고 이제 _()

을, 구문의 나머지는 제자리에 해당 될

// This is a local function 
IEnumerable <T> _() { 
    ... 
} 

(질문에 대한 영업 이익의 코멘트) 우리는 단지 yield returnforeach을 할 수? 복사 한

방법은 차이를 이해하는 열쇠 두 개의 추가 라인 포함 :

public static IEnumerable<T> Pipe<T>(this IEnumerable<T> source, Action<T> action) 
{  
    if (source == null) throw new ArgumentNullException(nameof(source)); 
    if (action == null) throw new ArgumentNullException(nameof(action)); 
    return _(); IEnumerable <T> _() 
    { 
     foreach (var element in source) 
     { 
      action(element); 
      yield return element; 
     } 
    } 
} 

직접 Pipe<T> 방법의 몸으로 yield returnforeach을 넣으면를 인수 검사가 지연 될 것 IEnumerable<T> 결과를 반복하기 시작할 때까지 지역 함수를 사용하면 호출자가 결과를 반복하지 않는 상황에서도 Pipe<T>이 호출되는 즉시 검사를 수행합니다.

+0

멋진 기능. 반환 후 _local 함수 _를 정의하면 작동합니까? –

+0

@FelipeOriani 나에게도 흥미 롭다. 돌아온 후에도 작동합니까? – Aria

+0

@FelipeOriani 예. 사실, Microsoft 예제는 사용 후에 정의 된 로컬 함수를 보여줍니다. – dasblinkenlight

관련 문제