我想以一种很好的方式传递< =运算符在双打
例如
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);
谢谢你, 学家
答案 0 :(得分:3)
不使用其他方法可以获得的最短时间是:
var c2 = a.Zip(b, (x, y) => x <= y);
编译器会从x
和y
类型为您扣除a
和b
的类型。
如果您不喜欢它,可以声明帮助方法:
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));