Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#函数,它接受任意维的锯齿数组_C#_Arrays_.net_Visual Studio - Fatal编程技术网

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=新双

在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=新双精度[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()
)我们不知道您的方法需要完成什么,因此我们现在无法提供比这更具体的建议,但希望您可以尝试这两种方法