C# 在不存在集合的情况下合成筛选器?

C# 在不存在集合的情况下合成筛选器?,c#,C#,我想我可能有一个暂时的心理问题,所以如果这是一个愚蠢的问题,请原谅,但我想知道是否有人可以编写过滤器,以便将其应用于集合: static void Main(string[] args) { int[] a = { 1, 2, 3, 4 }; Func<int, bool> filter = GetFilter(); IEnumerable<int> result = a.Where(filter);

我想我可能有一个暂时的心理问题,所以如果这是一个愚蠢的问题,请原谅,但我想知道是否有人可以编写过滤器,以便将其应用于集合:

    static void Main(string[] args)
    {
        int[] a = { 1, 2, 3, 4 };
        Func<int, bool> filter = GetFilter();
        IEnumerable<int> result = a.Where(filter);
    }

    private static Func<int, bool> GetFilter()
    {
        Func<int, bool> filter = c => c % 2 == 0;

        // What if I wanted to further refine my filter here?
        // For instance, add a ceiling of 10

        return filter;
    }
static void Main(字符串[]args)
{
int[]a={1,2,3,4};
Func filter=GetFilter();
IEnumerable result=a.Where(过滤器);
}
私有静态Func GetFilter()
{
Func filter=c=>c%2==0;
//如果我想进一步完善我的过滤器呢?
//例如,添加10的上限
回流过滤器;
}

return f=>c我认为您必须添加对原始筛选器的引用,以避免递归调用

var previousFilter = filter;
filter = c => previousFilter(c) && c <= 10;
var-previousFilter=filter;

filter=c=>previousFilter(c)&&c@Jonesy编辑了它,谢谢-顺便说一下,+=没有得到正确的结果。。它也不会爆炸。。。不知道是什么does@Jonesy事实上,这是行不通的。如果调用
filter(1)
它将返回
true
,而不是
false
。我相信它只返回最后一个委托的返回值。哎哟,你说得对,结果不正确。@aaronode A
Func
只是一个委托,你对委托使用
+=
,使其成为多播委托。这主要用于返回为void的事件,但似乎如果有返回值,它将返回由添加的最后一个委托生成的值。下面是一个有趣的链接,介绍了我实际遇到的返回类型为的多播委托。递归是如何发生的?
var previousFilter = filter;
filter = c => previousFilter(c) && c <= 10;