C# 有没有办法重载自定义类型的数学函数?
我知道可以对自定义类型执行运算符重载(+-*/)。对于自定义数学函数也有同样的方法吗?这将使向量操作更自然(如R中)。例如:C# 有没有办法重载自定义类型的数学函数?,c#,.net,operator-overloading,C#,.net,Operator Overloading,我知道可以对自定义类型执行运算符重载(+-*/)。对于自定义数学函数也有同样的方法吗?这将使向量操作更自然(如R中)。例如: vector = [1, 2, 3, 4, 5] vector + vector = [2, 4, 6, 8, 10] # can be achieved with operator overloading vector * 5 = [5, 10, 15, 20, 25] # can be achieved with operator overloading pow
vector = [1, 2, 3, 4, 5]
vector + vector = [2, 4, 6, 8, 10] # can be achieved with operator overloading
vector * 5 = [5, 10, 15, 20, 25] # can be achieved with operator overloading
pow(vector, 2) = [ 1, 4, 9, 16, 25 ] # is it possible in C#?
更新从下面的答案中,我看到“函数重载”是不可能的(可能没有多大意义),最好的处理方法是创建自定义数学函数库(静态类)。
这个解决方案很好,不过有没有办法将“自定义函数”与其他自定义类型一起重用?假设我有数字(int/float)、复数、向量和矩阵(向量数组)。我希望我的Pow函数能够处理所有4种类型(它应该为对象中的每个数字元素供电)。
此外,是否有一种方法可以让函数根据输入类型执行不同的操作?比如说
abs(-1) = 1 # for integer abs just change the sign if negative
abs(4+3i) = sqrt(4^2+3^2) = 5 # smth different for complex number
您可以为数组类创建扩展方法pow()
public static class VecorExtension
{
public static void pow(this Array vector, int i)
{
...
}
}
用法:
[1,2,3].pow(2)
您可以为数组类创建扩展方法pow()
public static class VecorExtension
{
public static void pow(this Array vector, int i)
{
...
}
}
用法:
[1,2,3].pow(2)
您可以通过使用C#6中添加的
使用static
功能来实现类似的功能。这允许您使类中的静态方法可用,而无需指定类型名称。(经常引用.NETMath
类作为此功能的首选。)
假设一个Vector
类实现了IEnumerable
,您可以创建一个包含静态Pow
函数的类:
namespace Vectors
{
public static class VectorMath
{
public static Vector Pow(Vector v, int exponent)
{
return new Vector(v.Select(n => Math.Pow(n, exponent)));
}
}
}
然后,在要使用该类的任何代码文件中,包括该语句
using static Vectors.VectorMath;
这将允许您调用Pow
方法,而无需指定它是VectorMath
类的成员:
class Program
{
static void Main(string[] args)
{
Vector v = new Vector { 1, 2, 3 };
Vector squares = Pow(v, 2);
// Squares now contains [1, 4, 9]
}
}
您可以通过使用C#6中添加的
usingstatic
功能来实现类似的功能。这允许您使类中的静态方法可用,而无需指定类型名称。(经常引用.NETMath
类作为此功能的首选。)
假设一个Vector
类实现了IEnumerable
,您可以创建一个包含静态Pow
函数的类:
namespace Vectors
{
public static class VectorMath
{
public static Vector Pow(Vector v, int exponent)
{
return new Vector(v.Select(n => Math.Pow(n, exponent)));
}
}
}
然后,在要使用该类的任何代码文件中,包括该语句
using static Vectors.VectorMath;
这将允许您调用Pow
方法,而无需指定它是VectorMath
类的成员:
class Program
{
static void Main(string[] args)
{
Vector v = new Vector { 1, 2, 3 };
Vector squares = Pow(v, 2);
// Squares now contains [1, 4, 9]
}
}
您只需编写自己的
pow
方法。这不能满足您的需要吗?或者您可以重载^
操作符,但这可能会带来一些混乱。不,这只是伪代码。假设我有一个处理整数/浮点数的标准数学库,想知道是否有一种方法可以将它与vector type.pow一起重用,这只是一个例子。我想将它与其他函数一起使用,比如sin、cos、sqrt等。您只需编写自己的pow
方法。这不能满足您的需要吗?或者您可以重载^
操作符,但这可能会带来一些混乱。不,这只是伪代码。假设我有一个处理整数/浮点数的标准数学库,想知道是否有一种方法可以将它与vector type.pow一起重用,这只是一个例子。我想将它与其他函数(如sin、cos、sqrt、etcI)一起使用。我担心这会将扩展方法添加到所有可能非常反直观的Array
类型,更不用说实现的复杂性。我担心这会将扩展方法添加到所有可能非常反直观的Array
类型,更不用说实现的复杂性了。听起来是个不错的解决方案,至少方法是从向量类中分离出来的(我认为这是我的主要需求)。理想情况下,我希望让所有数学函数(或自定义函数集)一次性使用向量类型(而不是为每个函数创建包装器)。这可能是不可能的,只是想确保我没有错过一些魔法trick@MikeTwc不幸的是,这是不可能的,数学在C#中超越了泛型的能力。您可以在LINQ中看到这一点,例如,在LINQ中,所有数字类型及其可为空的变量都有重载。您可能能够提取一些常见的语义,但如果您最后考虑一下,像Pow
这样的函数具有特定于类型的实现(通常是平台的指令集),因此在框架级别提供通用软件实现没有多大意义。听起来是个不错的解决方案,至少方法是从vector类中分离出来的(我认为这是我的主要需求)。理想情况下,我希望让所有数学函数(或自定义函数集)一次性使用向量类型(而不是为每个函数创建包装器)。这可能是不可能的,只是想确保我没有错过一些魔法trick@MikeTwc不幸的是,这是不可能的,数学在C#中超越了泛型的能力。您可以在LINQ中看到这一点,例如,在LINQ中,所有数字类型及其可为空的变量都有重载。您可能能够提取一些常见的语义,但如果您最后考虑一下,像Pow
这样的函数具有特定于类型的实现(通常是平台的指令集),因此在框架级别提供通用软件实现没有多大意义。