2011-09-17 46 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:如果您願意,您也可以使用Tuple或KeyValuePair - 這樣更容易閱讀 –

+0

對,這樣更容易閱讀。儘管在答案中有一個輕微的錯字,那就是新增了匿名類型。 –

相關問題