这段代码没有任何问题,但作为一项心理练习我修改了这个:
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#答案也会很好。
答案 0 :(得分:2)
您可以通过Enumerable.Zip并临时制作:
var filtered = outer
.Zip(inner, (o, i) => new {Outer = o, Inner = i})
.Where(pair => outerFilter(pair.Outer))
.Select(pair => pair.Inner);
它肯定会做一些额外的工作(因为在中间创建了额外的类型),但它应该提供相同的结果。