首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在NRules中进行最优写入规则定义

如何在NRules中进行最优写入规则定义
EN

Stack Overflow用户
提问于 2015-06-01 10:18:19
回答 2查看 2K关注 0票数 2

NRules SimpleRule的代码定义了以下规则:

代码语言:javascript
复制
public class PreferredCustomerDiscountRule : Rule
{
    public override void Define()
    {
        Customer customer = null;
        IEnumerable<Order> orders = null;

        When()
            .Match<Customer>(() => customer, c => c.IsPreferred)
            .Collect<Order>(() => orders,
                o => o.Customer == customer,
                o => o.IsOpen,
                o => !o.IsDiscounted);

        Then()
            .Do(ctx => ApplyDiscount(orders, 10.0))
            .Do(ctx => LogOrders(orders))
            .Do(ctx => orders.ToList().ForEach(ctx.Update));
    }
        ...
}

我想知道为什么条件是分开的参数,而不是仅仅使用&&操作符,也就是说,下面的情况会有同样的效果吗?

代码语言:javascript
复制
public class PreferredCustomerDiscountRule : Rule
{
    public override void Define()
    {
        Customer customer = null;
        IEnumerable<Order> orders = null;

        When()
            .Match<Customer>(() => customer, c => c.IsPreferred)
            .Collect<Order>(() => orders,
                o => o.Customer == customer && o.IsOpen && !o.IsDiscounted);

        Then()
            .Do(ctx => ApplyDiscount(orders, 10.0))
            .Do(ctx => LogOrders(orders))
            .Do(ctx => orders.ToList().ForEach(ctx.Update));
    }
        ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-01 11:33:35

这两个定义应该做同样的事情。收集方法需要一个Expression<Func<T, bool>>数组。第一个条件将其分解为3个单独的条件,而第二个条件只使用一个条件(和-组合)。

我认为这是品味的问题,你喜欢哪一种。但是对于第一个条件,可以清除哪些条件是相关的,您可以轻松地删除或添加条件(通过注释//)。

票数 1
EN

Stack Overflow用户

发布于 2015-07-24 02:07:28

在提供由‘&’分隔的组件的单个条件表达式和提供多个条件表达式之间存在差异。

在幕后,规则被编译成一个网络(rete网络),每个条件都由网络中的一个节点表示。当多个规则共享相同的条件子集时,这些节点在网络中被共享,从而产生效率(因为需要评估的条件较少)。由于节点共享,提供多个条件表达式给引擎提供了更多的优化机会。

另一个不同之处是条件短路.当使用‘&’运算符提供单个条件表达式时,适用标准的C#条件短路。如果第一个条件为false,则不计算第二个条件。当提供多个条件时,这并不一定是正确的(因为优化是由不同级别的引擎完成的)。

最佳实践是使用多个条件表达式,而不是一个带有“&&”的条件表达式。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30570941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档