C#函数,它接受任意维的锯齿数组
在C#中是否有声明一个接受任意维锯齿数组的函数?现在,如果我在一个接受一维数组的函数中传入一个锯齿数组,它会给我一个错误:C#函数,它接受任意维的锯齿数组,c#,arrays,.net,visual-studio,C#,Arrays,.net,Visual Studio,在C#中是否有声明一个接受任意维锯齿数组的函数?现在,如果我在一个接受一维数组的函数中传入一个锯齿数组,它会给我一个错误: void func<T>(T[] arr){ return; } double[][] x = new double[10][]; func<double>(x); // Error: cannot convert from double[][] to double[] void func(T[]arr){ 返回; } 双精度[]x=新双
void func<T>(T[] arr){
return;
}
double[][] x = new double[10][];
func<double>(x);
// Error: cannot convert from double[][] to double[]
void func(T[]arr){
返回;
}
双精度[]x=新双精度[10][];
func(x);
//错误:无法从双精度[]转换为双精度[]
是否有任何方法可以更改函数签名,使其同时接受一维数组和锯齿数组?该函数将仅执行对锯齿阵列和1D阵列都有效的操作。我真的不想使用重载,因为交错数组的维度可能未知。要接受任何类型、任何大小和任意数量的维度数组参数,可以使用
系统
命名空间中的数组
类
下面是它的样子:
void Function(Array arr)
{
//Do your stuff with "arr",
//you can mostly just treat it like a normal array, looping and so on...
}
如果您想知道特定维度的长度,只需使用Array.GetLength(int-dimension)
函数即可
如果您还想知道这个数组有多少个维度,只需使用array.Rank属性
至于这个问题,你可以简单地这样做,它不会引起任何问题:
double[][] x = new double[10][];
Func<double>(x);
double[]x=新的double[10][];
Func(x);
MS文档:
希望这对你有帮助 要接受任意类型、任意大小和任意数量的数组参数,可以使用
系统
命名空间中的数组
类
下面是它的样子:
void Function(Array arr)
{
//Do your stuff with "arr",
//you can mostly just treat it like a normal array, looping and so on...
}
如果您想知道特定维度的长度,只需使用Array.GetLength(int-dimension)
函数即可
如果您还想知道这个数组有多少个维度,只需使用array.Rank属性
至于这个问题,你可以简单地这样做,它不会引起任何问题:
double[][] x = new double[10][];
Func<double>(x);
double[]x=新的double[10][];
Func(x);
MS文档: 希望这对你有帮助
表示任何类型。只要你尊重这种神秘类型的操作和有效状态,它可以是任何东西。此外,它是从作为参数提供给方法的类型中推导出来的,因此您只需要在声明它时显式,而不需要在调用它时显式
所以,您做了一个更改以接受名为。。。idk,转换:
这可能是它的特征:void Transform(T数组)
。在本例中,T已经是一个数组,如果参数是类型为T的数组(例如:void f(T[]a
),则这将是签名,依此类推
T是一个模板,一种在编译时(有时甚至在运行时)可能构建的类型模板编程的力量是巨大的,并且由于C的编码器第一哲学,我们可以体验到它的完全荣耀而不必为C++的教科书浪费掉几滴眼泪。 <代码>代码>意味着任何类型。只要你尊重这种神秘类型<代码> <代码>的操作和有效状态,它就可以是任何东西。从作为参数提供给该方法的类型中推导出来,因此在声明该方法时只需要显式,而在调用该方法时不需要显式
所以,您做了一个更改,接受名为…idk,Transform的N维数组:
这可能是它的签名:void Transform(T array)
。在这种情况下,T已经是一个数组,如果参数是类型为T的数组(例如:void f(T[]a
),这将是签名,依此类推
T是模板,一种在编译时可能会生成的模板(有时甚至在运行时)。模板编程的力量巨大,并且由于C的编码器第一哲学,我们可以在完全荣耀的情况下体验,而不必为C++教科书浪费几滴眼泪。 在C#中是否有声明一个接受任意维锯齿数组的函数
是的,您实际上已经有了一个。您的解决方案采用任何T[]
,而T
本身可以是数组类型-这正是锯齿数组的工作方式。因此,让我们使用原始函数(只需将名称更改为更常规的名称,避免与Func
委托类型混淆):
void进程数组(T[]数组)
{
//(方法主体暂时不相关)
}
如果希望该方法处理double[]
,则该方法的类型参数(即该方法调用的T
类型)必须是double
。如果希望该方法处理double[][
,则类型参数必须是double[]
,依此类推
可以通过显式指定类型参数来执行此操作:
double[]simpleArray=newdouble[10];
ProcessArray(simpleArray);
double[]jaggedArray=新的double[10][];
ProcessArray(jaggedArray);
或者,您可以使用泛型类型推断,让编译器自动计算出T
所需的类型参数:
double[]simpleArray=newdouble[10];
ProcessArray(simpleArray);
double[]jaggedArray=新的double[10][];
ProcessArray(jaggedArray);
根据我的经验,在调用泛型方法时通常可以使用类型推断,但也有需要显式指定类型参数的例外情况
您面临的问题是,您提供的类型参数是double
,而常规参数的类型是double[][]
现在,如果您想在方法中处理所有单独的元素,例如用每个“不太锯齿”的数组递归调用您的方法,那么您可能需要使用反射(例如typeof(T).GetElementType()
)我们不知道您的方法需要完成什么,因此我们现在无法提供比这更具体的建议,但希望您可以尝试这两种方法