当前位置: 首页 > 知识库问答 >
问题:

c#数学运算的一般方法

焦光霁
2023-03-14

我想创建一个执行基本数学运算的通用方法。例如,如果将double传递给函数,它将返回double。

public static T Multiply<T> (T A, int B)
{
   //some calculation here
   return (T) A * B; 
}

这对我不起作用。

编辑:我得到一个错误运算符“*”不能应用于“T”和“int”类型的操作数

然而,我想知道是否有其他方法来实现我正在努力的目标?

谢啦

共有3个答案

蒋奕
2023-03-14

被困在旧的. net版本上,无法访问动态,我有一个非常简单的类,它可以做很多你正在寻找的事情,并允许使用实际的运算符:数字它可能值得看看当前的. net。

方法声明:

public static T LerpMinMax<T>(Numeric<T> input, Numeric<T> inputMin, Numeric<T> inputMax, Numeric<T> outputMin, Numeric<T> outputMax)
{
     if (input <= inputMin)
     {
        return outputMin;
     }
     else if (input >= inputMax)
     {
        return outputMax;
     }
     return outputMin + ((input - inputMin) / (inputMax - inputMin)) * (outputMax - outputMin);
}

然后使用:

float lerp = LerpMinMax<float>(0.55f, 0.0f, 0.1f, 0.0f, 1000.0f);

它肯定不如MiscUtil的运算符灵活,但其目的是简单且(相对)快速。它仍然比直接使用操作慢得多(例如,通过使用T4模板吐出非泛型类型特定的实现),但以上述方式使用它相当于MiscUtil的运算符类。显然,它还具有通常更可读的算法实现的优点,并且可以支持实现运算符的自定义类。

狄宾实
2023-03-14

这是最简单的实现方法,但效率不高:

  public static T Multiply<T>(T A, int B)
  {
     T val = default(T);
     try
     {
        val = (dynamic)A * B;
     }
     catch
     { }

     return val;
  }

根据您的需要,它可能适合您。您可以考虑不在方法中处理异常,或者使用out值,以便您可以同时返回答案和成功值。

贺飞
2023-03-14

可以通过为特定类型构造和编译LINQ表达式来实现,如下所示:

private static IDictionary<Type,object> MultByType = new Dictionary<Type,object>();
public static T Multiply<T>(T a, int b) {
    Func<T,int,T> mult;
    object tmp;
    if (!MultByType.TryGetValue(typeof (T), out tmp)) {
        var lhs = Expression.Parameter(typeof(T));
        var rhs = Expression.Parameter(typeof(int));
        mult = (Func<T,int,T>) Expression.Lambda(
            Expression.Multiply(lhs, Expression.Convert(rhs, typeof(T)))
        ,   lhs
        ,   rhs
        ).Compile();
        MultByType.Add(typeof(T), mult);
    } else {
        mult = (Func<T,int,T>)tmp;
    }
    return mult(a, b);
}

为了避免每次使用时重新编译表达式,可以将其缓存在字典中。

注意,这种方法有一定的局限性:

  • 预计将定义T与T的乘积,
  • 乘法的输出预计为T,无需转换。对于小于int的类型,情况并非如此
  • 类型必须支持从int转换

编译时不会检查这些内容。

 类似资料:
  • 四则运算符(+、-、*、/、+=、-=、*=、/=)和关系运算符(>、<、<=、>=、==、!=)都是数学运算符,它们在实际开发中非常常见,被重载的几率也很高,并且有着相似的重载格式。本节以复数类 Complex 为例对它们进行重载,重在演示运算符重载的语法以及规范。 复数能够进行完整的四则运算,但不能进行完整的关系运算:我们只能判断两个复数是否相等,但不能比较它们的大小,所以不能对 >、<、<=

  • 1.4.1常量和变量类型 a) 常量 常量是指其值始终不变的一些量。整型、实型、双精度和复型常量是算数型常量,也为常数。 整型:默认值为4字节(其它为1,2,8字节,Compaq Visual Fortran允许在Alpha机上使用8字节整数)。4字节32位(bit)中用一位存放数值的符号,其余为数本身(用二进制表示)。第1位为O表示“正”,“1”表示“负”。由于用有限的内存单元存储一个整数,因此

  • 我想用一个按钮和文本框进行数学运算,当输入文本框操作如25 5-10 7并按下按钮显示结果时,我正在尝试这样做,但我做不到。在这段代码中,我为文本框中的每个字符创建一个,我希望在firstvalue参数和op参数中存储25个,在secondvalue参数中存储5个,并使操作25 5=30,将其存储在firstvalue参数和store-in op中,在secondvalue中存储10个,并将其存储

  • Math can be applied directly to variable values. 数学运算可以直接应用到变量 Example 3-5. math examples 例 3-5.数学运算的例子 {$foo+1} {$foo*$bar} {* some more complicated examples *} {$foo->bar-$bar[1]*$baz->foo-

  • 问题 你写的最新的网络认证方案代码遇到了一个难题,并且你唯一的解决办法就是使用复数空间。 再或者是你仅仅需要使用复数来执行一些计算操作。 解决方案 复数可以用使用函数 complex(real, imag) 或者是带有后缀j的浮点数来指定。比如: >>> a = complex(2, 4) >>> b = 3 - 5j >>> a (2+4j) >>> b (3-5j) >>> 对应的实部、虚部和

  • 主要内容:RxJava 数学运算符 介绍,RxJava 数学运算符 示例RxJava 数学运算符 介绍 以下是 Observable 的数学运算符。 运算符 描述 Average 评估所有项目的平均值并发出结果。 Concat 不交错地从多个 Observable 发出所有项目。 Count 计算所有项目并发出结果。 Max 评估所有项目的最大值项目并发出结果。 Min 评估所有项目的最小值项目并发出结果。 Reduce 对每个项目应用一个函数并返回结果。 Sum 评