C# 7의 새로운 기능과 특히 로컬 메소드를 실험하고있었습니다. 나는 Linq Where Operator를 썼다.C# 7 Local Methods에서 새로운 일반 매개 변수를 다시 도입하는 것이 좋습니다.
로컬 메서드로 반복자 블록을 구현했습니다. 실제로 로컬 메서드는 비동기 메서드 및 반복자에 대한 완벽한 솔루션이라고 말하는 기사를 읽었습니다.
두 구현 사이에 차이점이 있는지 궁금한데 어느 것이 가장 좋지 않은가요?
먼저 구현 : 여기에
나는 ... 매개 변수에 대한 로컬 방법, 새 이름에 대한 새로운 제네릭 형식 매개 변수를 도입
public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if(source == null) throw new ArgumentNullException(nameof(source));
if(predicate == null) throw new ArgumentNullException(nameof(predicate));
return WhereIterator(source, predicate);
IEnumerable<TSequence> WhereIterator<TSequence> (IEnumerable<TSequence> localSource, Func<TSequence, bool> localPredicat) {
foreach(TSequence item in localSource) {
if(localPredicat(item)) {
yield return item;
}
}
}
}
두 번째 구현 :
새로운 일반 매개 변수가 없으며 새로운 p가 없습니다. arameters는 로컬 메서드가 포함 된 메서드의 변수를 캡처 할 수 있기 때문에.
public static IEnumerable<TSource> Where<TSource> (this IEnumerable<TSource> source, Func<TSource, bool> predicate) {
if(source == null) throw new ArgumentNullException(nameof(source));
if(predicate == null) throw new ArgumentNullException(nameof(predicate));
return WhereIterator();
IEnumerable<TSource> WhereIterator() {
foreach(TSource item in source) {
if(predicate(item))
yield return item;
}
}
}
}
WhereIterator가 필요한 이유가 전혀 없습니다. 당신은 그것을 가질 수없고, Where 메서드에서 foreach 할 수 있습니다. – rokkerboci
디 컴파일 된 소스 [여기] (https://sharplab.io)를 확인할 수 있습니다. 해당 기능을 작성하고 오른쪽 창에 결과를 확인하십시오. –
나는 열의 인수 유효성 검사가 필요합니다 :) WhereIterator 메서드를 사용하지 않으면 인수 유효성 검사가 느리게 수행됩니다. 그래서 로컬 메서드로 반복자를 구현했습니다. –