我想创建一个执行基本数学运算的通用方法。例如,如果将double传递给函数,它将返回double。
public static T Multiply<T> (T A, int B)
{
//some calculation here
return (T) A * B;
}
这对我不起作用。
编辑:我得到一个错误运算符“*”不能应用于“T”和“int”类型的操作数
然而,我想知道是否有其他方法来实现我正在努力的目标?
谢啦
被困在旧的. 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的运算符类。显然,它还具有通常更可读的算法实现的优点,并且可以支持实现运算符的自定义类。
这是最简单的实现方法,但效率不高:
public static T Multiply<T>(T A, int B)
{
T val = default(T);
try
{
val = (dynamic)A * B;
}
catch
{ }
return val;
}
根据您的需要,它可能适合您。您可以考虑不在方法中处理异常,或者使用out
值,以便您可以同时返回答案和成功值。
可以通过为特定类型构造和编译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);
}
为了避免每次使用时重新编译表达式,可以将其缓存在字典中。
注意,这种方法有一定的局限性:
编译时不会检查这些内容。
四则运算符(+、-、*、/、+=、-=、*=、/=)和关系运算符(>、<、<=、>=、==、!=)都是数学运算符,它们在实际开发中非常常见,被重载的几率也很高,并且有着相似的重载格式。本节以复数类 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 评