赋予代表属性的优雅方式 - c#

假设我在课堂上有一些事件:

 class SomeClass{
     event ChangedEventHandler SomeDoubleChanged;
     double SomeDouble;
 }

与:

 delegate void ChangedEventHandler(double d);

现在假设我想在SomeDouble上侦听更改事件,但只想触发大于delta的更改。现在我可以做类似的事情

 SomeObject.SomeDoubleChanged += (d) => {if(abs(d-old_d) > delta){
                                  //do something     
                                 };

但是我希望我的事件能够解决这个问题,所以在最好的情况下,我想做些类似的事情:

 SomeObject.SomeDoubleChange += (delta, (d) => {});

并且仍然允许:

 SomeObject.SomeDoubleChange += (d) => {};

我想到的唯一实现该方法的方法是删除整个事件关键字,并使用+ =和-=运算符实现一个容器,该容器对指定的委托进行操作。但是我认为这不是一个非常优雅的解决方案,因为它使SomeClass的用户认为SomeDoubleChanged是没有事件的。

什么是解决这个问题的最佳方法?

参考方案

(鉴于您也在使用lambda表达式,因此我建议您不要在这里使用术语“ lambda”。听起来您对更改(即增量)感兴趣。)

您可以创建自己的静态方法来创建适当的委托:

public static ChangedEventHandler FilterByDelta(double delta,
                                                ChangedEventHandler handler)
{
    double previous = double.MinValue;
    return d =>
    {            
        if (d - previous > delta)
        {
            handler(d);
        }
        // Possibly put this in the "if" block? Depends on what you want.
        previous = d;
    };
}

然后,您可以使用:

SomeObject.SomeDoubleChange += Helper.FilterByDelta(5, d => ...);

不幸的是,您不能在lambda表达式上使用扩展方法,这会使此操作变得更容易。

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…

如何使用箭头符号(->)创建受保护的方法? - java

当我们编写以下代码时Stream.of(1,2,3,4,5).filter(i -> (i%2 == 0)).map( i -> i*i ); 表达式i -> (i%2 == 0)或i -> i*i将变为私有方法。在我的用例中,编写了一个junit测试,以确保没有方法是私有的(是的,这是强制性的),并且对于这些lambda表达式而言,…

粗糙的Unicode->没有CLDR的语言代码? - javascript

我在写字典应用。如果用户键入Unicode字符,我想检查该字符是哪种语言。例如字 - returns ['zh', 'ja', 'ko'] العربية - returns ['ar'] a - returns ['en', 'fr', …

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

LeetCode题解求一根绳子被切两刀能组成一个三角形的概率。

如题题解:我们可以设绳长为1,设:- 其中两段长为x, y且x, y都>0- 故第三段长为1-x-y且>0故可以在二维坐标轴画出一个三角形(由x=0;y=0;1-x-y=0围成)要想构成三角形还要满足:- x+y > 1-x-y => x+y > 0.5- x+1-x-y > y => y < 0.5- y+1…