代码之家  ›  专栏  ›  技术社区  ›  JaredBroad

我是否可以将带有运行时变量的Func<>函数设置为省略在C#中作为参数传递它们?

  •  1
  • JaredBroad  · 技术社区  · 16 年前

    我有一个数值分析程序,为简单起见,该程序计算的算法类似于:

    y = ax^3 + bx^2 + cx + d;
    

    我在运行时计算a、b、c、d的值,并希望将以下等效值作为 Func<double, double>

    y = 12x^3 + 13x^2 + 14x + 15; 
    

    我意识到这可以通过传递双数组来实现,如下所示: Func<double[], double> 但我试图避免传递常数(可能很多)。

    有没有办法在运行时在func中设置这些数字?

    (最好不计算函数的a、b、c、d部分<&燃气轮机;它本身a、b、c、d的计算为工作的80%)

    例如。:

    a = ...
    
    b = ...
    
    c = ...
    
    Func<x, double> {
         ((const)a) * x^3 +   ((const)b) * x^2 +   ((const)c) * x + 15;
    }`
    

    对于每个ABCD评估-我将评估10个x。

    5 回复  |  直到 16 年前
        1
  •  11
  •   Alex    16 年前

    Func<double, double> CreateCalculationFunc()
    {
        double a = heavy calculation;
        double b = heavy calculation;
        double c = heavy calculation;
        double d = heavy calculation;
    
        Func<double, double> calculation = (x) =>
        {
            // You can use the constants in here without passing them as parameters
            return x * (a * b / c - d);
        };
    
        return calculation;
    }
    

    CreateCalculationFunc() ,它将执行一次繁重的计算,并返回一个可重用的 Func<double,double> 用于进行变量计算。

    当然,这可以扩展到任何数量的预先计算的常量和多个变量。

        2
  •  2
  •   to StackOverflow    16 年前

    您不能创建一个包含您的计算的类吗( Func<double,double> )方法,该方法具有“常量”的属性。然后设置属性并使用对 Calculate 方法作为您的 Func<双倍,双倍> 代表:

    public class Calculator
    {
        public double A { get; set; };
        public double B { get; set; };
        public double C { get; set; };
        public double D { get; set; };
    
        public double Calculate(double x)
        {
            return A*x*x*x + B*x*x + C*x + D;
        }
    }
    
        3
  •  2
  •   Benjamin Podszun    16 年前

    Func<a, b, c, d, x, result>

    Func<a, b, c, d, x, result>(valueOfA)
    

    将生成具有签名的函数

    Func<b, c, d, x, result>
    

    你可以传下去。

    或者——试试看)

    编辑:从上面的参考站点创建的简短代码示例:

    样板代码:

        public static Func<B, R> Partial<A, B, R>(this Func<A, B, R> f, A a) {
            return b => f(a, b);
        }
    
        public static Func<B, C, R> Partial<A, B, C, R>(this Func<A, B, C, R> f, A a) {
            return (b, c) => f(a, b, c);
        }
    
        public static Func<B, C, D, R> Partial<A, B, C, D, R>(this Func<A, B, C, D, R> f, A a) {
            return (b, c, d) => f(a, b, c, d);
        }
    

    Func<double, double, double, double, double> yourCalculation = (a, b, c, x) => a*Math.Pow(x, 3) + b*Math.Pow(x, 2) + c*x;
    
    var aDefined = yourCalculation.Partial(12);
    var bDefined = aDefined.Partial(13);
    var cDefined = bDefined.Partial(14);
    

    cDefined现在是一个新的Func,它“知道”预先应用的值,并且可以根据需要传递。我找不到具有4个以上参数的代理的现成解决方案(即不适合Func<>),但这也应该是可能的。

    通过这种方式,您只需按今天的方式预先计算一次,但您可以将功能缩小到每个消费者的最后一部分。

        4
  •  0
  •   Oded    16 年前

    with 5 generic parameters ,第一个是 KeyValuePair :

    Func<KeyValuePair<double,double>,double,double,double,double>
    

        5
  •  0
  •   JaredBroad    16 年前

    事后看来,我其实可以这样做;

    Class {
        a = ...
        b = ...
    
        Func Algorithm = (x) => {
            return x*a + x*b;
        }
    
        return Algorithm;
    }
    

    但是被Func搞糊涂了<&燃气轮机;和行动<&燃气轮机;因为这是我第一次使用它们!谢谢你的帮助。