c# - 如何在 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
有人可以帮我解决这个问题吗?
解决方案
如果您有这样的编号字段,足以...
在描述它们时考虑使用省略号,您应该考虑使用类似 a 的集合属性List
或Array
代替。这将允许您使用Zip()
操作来比较它们:
numberings.Select(n => configs.All(c => c.Fields.Zip(n.Fields, (c1,n1) => c1!=n1).All());
推荐阅读
- visual-studio-code - 如何摆脱 VSCode 缩进指示符?
- authentication - 专用于特定客户的网站的身份验证?
- javafx - 如何等待 JavaFx MediaPlayer 完成
- android - 使用 kotlin 在 android studio 中创建按钮
- c - C中打开文件函数中标志和模式之间的联系是什么
- python - 获取表单中的用户
- scala - 创建数据集时 Spark 无法反序列化记录
- git - 恢复 Git 编辑器
- azure - 如何以编程方式将用户分配的托管标识分配给 Azure Web 应用暂存槽?
- symfony - Twig - 过滤日期星期几和上午/下午