首页 > 解决方案 > 如何在 C# 中构建复合表达式?

问题描述

我需要为以下内容构建一个表达式:

numberings(n=>configs.All(c=>c.Field1!=n.Field1 || c.Field2!=n.Field2 || ...))

我试着做这样的事情:

 BinaryExpression expression = null;
 foreach (var criteria in SelectionCriteria)
        {
            Expression<Func<Numbering, TConfiguration, bool>> exp = (_, c) => criteria.ConfigurationField(c) != criteria.NumberingField(_);
            expression = expression == null ? Expression.MakeBinary(ExpressionType.OrElse, exp, exp) : Expression.OrElse(expression, exp);
        }
        if (expression == null) return Result.Failure(string.Format(Errors.NumberingFieldSelectionNotDefined, $"{shipper}:{GetType().FullName}"));
        var lambda = Expression.Lambda<Func<TConfiguration, bool>>(expression);
        numberingsToRemove = numberingsToRemove.Where(_ => configsThatStay.All(lambda));

这就是我卡住的地方。编译器说:

没有为类型 'System.Func<TNumbering,TConfiguration,System.Boolean> 和 'System.Func<TNumbering,TConfiguration,System.Boolean> 定义二元运算符 OrElse

有人可以帮我解决这个问题吗?

标签: c#expression

解决方案


如果您有这样的编号字段,足以...在描述它们时考虑使用省略号,您应该考虑使用类似 a 的集合属性ListArray代替。这将允许您使用Zip()操作来比较它们:

numberings.Select(n => configs.All(c => c.Fields.Zip(n.Fields, (c1,n1) => c1!=n1).All());

推荐阅读