基于第二个序列上的过滤器从一个序列中进行选择

本文关键字:一个 选择 行选 第二个 过滤器 | 更新日期: 2023-09-27 18:09:04

这段代码没有什么问题,但作为脑力练习,我修改了这段代码:

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#答案也会很好

基于第二个序列上的过滤器从一个序列中进行选择

您可以通过Enumerable.Zip并创建一个临时的:

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

它确实做了一些额外的工作(因为在中间创建了额外的类型),但它应该提供相同的结果。