선택

2011-09-17 3 views
1

가이 코드는 아무 문제가 없지만 정신 운동으로 나는이 수정 :선택

public static IEnumerable<T> FiltersInnerWhere<T>(this IEnumerable<T> outer, IEnumerable<T> inner, Predicate<T> outerFilter) 
{ 
    IEnumerator<T> outerEnumerator = outer.GetEnumerator(); 
    IEnumerator<T> innerEnumerator = inner.GetEnumerator(); 
    while (outerEnumerator.MoveNext() && innerEnumerator.MoveNext()) 
    { 
     if (outerFilter(outerEnumerator.Current)) 
      yield return innerEnumerator.Current; 
    } 
} 

이 함께 결국 :

public static IEnumerable<T> FilteredMerge<T>(this IEnumerable<T> outer, IEnumerable<T> inner, Func<T, bool> outerFilter) 
{ 
    var outerEnumerator = outer.GetEnumerator(); 
    var filtered = inner.Where(_ => outerEnumerator.MoveNext() && outerFilter(outerEnumerator.Current)); 
    return filtered; 
} 

코드의 첫 번째 열거자를 직접 잡아 내지 않아도됩니까?

F # 답변도 좋을 것입니다.

답변

2

당신은 Enumerable.Zip를 통해이 작업을 수행하고 있었다 만드는 임시 :

var filtered = outer 
     .Zip(inner, (o, i) => new {Outer = o, Inner = i}) 
     .Where(pair => outerFilter(pair.Outer)) 
     .Select(pair => pair.Inner); 

(중간에 추가 유형의 생성이 이후) 그것은 확실히 추가 작업을 조금하고,하지만이 같은를 제공해야 결과.

+0

아, 항상 익명 유형을 잊어 버립니다. 시원한. 훌륭합니다. –

+0

@Ritch : 튜플 또는 KeyValuePair를 원할 경우 사용할 수도 있습니다. - 읽기가 더 쉽습니다. –

+0

바로 읽기가 훨씬 쉽습니다. 익명 유형을 처음 접하는 곳에서는 답변에 약간의 오타가 있습니다. –

관련 문제