c# - 合并数组中的多个 LINQ 表达式

标签 c# .net linq expression

我正在尝试像这样组合一个函数列表。

我有这个:

Func<int, bool>[] criteria = new Func<int, bool>[3];
criteria[0] = i => i % 2 == 0;
criteria[1] = i => i % 3 == 0;
criteria[2] = i => i % 5 == 0;

我想要这个:

Func<int, bool>[] predicates = new Func<int, bool>[3];
predicates[0] = i => i % 2 == 0;
predicates[1] = i => i % 2 == 0 && i % 3 == 0;
predicates[2] = i => i % 2 == 0 && i % 3 == 0 && i % 5 == 0;

到目前为止,我得到了以下代码:

Expression<Func<int, bool>>[] results = new Expression<Func<int, bool>>[criteria.Length];

for (int i = 0; i < criteria.Length; i++)
{
    results[i] = f => true;
    for (int j = 0; j <= i; j++)
    {
        Expression<Func<int, bool>> expr = b => criteria[j](b);
        var invokedExpr = Expression.Invoke(
            expr, 
            results[i].Parameters.Cast<Expression>());
        results[i] = Expression.Lambda<Func<int, bool>>(
            Expression.And(results[i].Body, invokedExpr), 
            results[i].Parameters);
    }
}
var predicates = results.Select(e => e.Compile()).ToArray();

Console.WriteLine(predicates[0](6)); // Returns true
Console.WriteLine(predicates[1](6)); // Returns false
Console.WriteLine(predicates[2](6)); // Throws an IndexOutOfRangeException

有人知道我做错了什么吗?

最佳答案

无需引入表达式...

    Func<int, bool>[] criteria = new Func<int, bool>[3];
    criteria[0] = i => i % 2 == 0;
    criteria[1] = i => i % 3 == 0;
    criteria[2] = i => i % 5 == 0;

    Func<int, bool>[] predicates = new Func<int, bool>[3];

    predicates[0] = criteria[0];
    for (int i = 1; i < criteria.Length; i++)
    {
        //need j to be an unchanging int, one for each loop execution.
        int j = i;

        predicates[j] = x => predicates[j - 1](x) && criteria[j](x);
    }

    Console.WriteLine(predicates[0](6)); //True
    Console.WriteLine(predicates[1](6)); //True
    Console.WriteLine(predicates[2](6)); //False

关于c# - 合并数组中的多个 LINQ 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/160604/

相关文章:

c# - 如何加快在 ASP.NET 中调用命令行工具的循环?

c# - 从 WCF FaultException 响应中提取详细信息

c# - 模拟流以读取字节[]

c# - 如果目标文件夹非常大,使用 System.Security.AccessControl 从文件夹 ACL 中删除 ACE 会非常慢

c# - 如何在序列中的linq中获取元素范围?

c# - Entity Framework + LINQ 缓慢与字符串查询速度?

C# for Windows Phone 7,为什么使用这种语言

c# - 使用 XAML 和路径标记语言的图表背景

c# - 对 Nullable<T> 约束的困惑

linq - LINQ Lambda-在一个列表中查找所有ID,而在另一个列表中不存在