如何以干净的方式将操作符作为参数传递?

时间:2014-02-17 17:05:18

标签: c#

我想以一种很好的方式传递< =运算符在双打

例如

 var a = new double[] { 1.0, 2.0, 3.0 };
 var b = new double[] { 5.0, 1.0, 3.0 };

例如,我可以使用Math.Max函数执行此操作:

var c = a.Zip(b, Math.Max);

但对于< = operator on double我必须写:

var c2 = a.Zip(b, (double x, double y)=> (x<=y));

与Math.Max表格相比,这是丑陋的。

有没有办法以下列其中一种方式写这个:

1 - var c2 = a.Zip(b, (double operator <=));
2 - var c2 = a.Zip(b, Double.LessOrEqualTo);

谢谢你, 学家

4 个答案:

答案 0 :(得分:3)

不使用其他方法可以获得的最短时间是:

var c2 = a.Zip(b, (x, y) => x <= y);

编译器会从xy类型为您扣除ab的类型。

如果您不喜欢它,可以声明帮助方法:

public static class DoubleExtensions
{
    public static bool LessOrEqual(this double first, double second)
    {
        return first <= second;
    }
}

并使用它:

var c = a.Zip(b, DoubleExtensions.LessOrEqual);

答案 1 :(得分:0)

您可以使用表达式树为您创建函数:

public static class Op
{
    public static Func<T, T, bool> Leq<T>()
    {
        var xp = Expression.Parameter(typeof(T));
        var yp = Expression.Parameter(typeof(T));
        var expr = Expression.LessThanOrEqual(xp, yp);
        return Expression.Lambda<Func<T, T, bool>>(expr, xp, yp).Compile();
    }
}

然后你可以做

var c = a.Zip(b, Op.Leq<double>());

答案 2 :(得分:0)

您可以编写自己的方法并将其作为参数传递。

static class DoubleClass
{
    static double LessOrEqualTo(double x, double y)
    {
        if(x <= y) return x;
        return y;
    }
}

然后你可以打电话:

double[] c2 = a.Zip(b, DoubleClass.LessOrEqualTo).ToArray();

答案 3 :(得分:-1)

Math.Max返回一个数值,其中double <=运算符返回bool。您期望单个方法如何适应两种返回类型(除非它被重载)?

假设它已超载,您可以创建一个Func<double, double, bool>,其中2 double为输入并返回bool

Func<double, double, bool> myDoubleFunc = (x, y) => { return x <= y };

然后叫它:

var c2 = a.Zip(b, myDoubleFunc(1.0, 2.0));