Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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#_.net 4.0_Multidimensional Array_Boxing - Fatal编程技术网

C# 如何一步将装箱二维数组转换为二维字符串数组?

C# 如何一步将装箱二维数组转换为二维字符串数组?,c#,.net-4.0,multidimensional-array,boxing,C#,.net 4.0,Multidimensional Array,Boxing,有没有一种方法可以使用C#/.NET Framework 4.0一步将装箱的二维数组转换为二维字符串数组 using ( MSExcel.Application app = MSExcel.Application.CreateApplication() ) { MSExcel.Workbook book1 = app.Workbooks.Open( this.txtOpen_FilePath.Text ); MSExcel.Worksheet sheet1 = (MSExcel.

有没有一种方法可以使用C#/.NET Framework 4.0一步将装箱的二维数组转换为二维字符串数组

using ( MSExcel.Application app = MSExcel.Application.CreateApplication() ) {
    MSExcel.Workbook book1 = app.Workbooks.Open( this.txtOpen_FilePath.Text );
    MSExcel.Worksheet sheet1 = (MSExcel.Worksheet)book1.Worksheets[1];
    MSExcel.Range range = sheet1.GetRange( "A1", "F13" );
    object value = range.Value; //the value is boxed two-dimensional array
}
我希望某种形式的Array.ConvertAll能够起作用,但到目前为止我还没有找到答案

string[][] strings = ((object[][])range.Value)
    .Select(x => x.Select(y => y.ToString()).ToArray()).ToArray();

编辑:关于对象[,]而不是对象[]的澄清显然使这种方法过时。一个有趣的问题;多维数组非常有限。

不,我不认为您可以一步完成转换,但我可能错了。但您当然可以创建一个新阵列,并将旧阵列复制到新阵列:

object value = range.Value; //the value is boxed two-dimensional array
var excelArray = value as object[,];
var height = excelArray.GetLength(0);
var width = excelArray.GetLength(1);
var array = new string[width, height];
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
        array[i, j] = excelArray[i, j] as string;
}

您可以为二维数组编写自己的
ConvertAll

public static TOutput[,] ConvertAll<TInput, TOutput>(
    this TInput[,] array, Func<TInput, TOutput> converter)
{
    int length0 = array.GetLength(0);
    int length1 = array.GetLength(1);

    var result = new TOutput[length0, length1];

    for (int i = 0; i < length0; i++)
        for (int j = 0; j < length1; j++)
            result[i, j] = converter(array[i, j]);

    return result;
}
publicstatictoutput[,]ConvertAll(
此TInput[,]数组,Func转换器)
{
int length0=array.GetLength(0);
int length1=array.GetLength(1);
var结果=新的TOutput[长度0,长度1];
对于(int i=0;i
值的实际类型是什么?它只是对象[][]?根据文档,它是系统。对象:对不起,我指的是运行时类型,而不是属性的类型。如果对该值调用GetType(),它是什么?value.GetType()的结果是什么??GetType()返回“System.Object[,]”作为值。如果我不能一步完成,我将采用这种方法。其目的是使用内置的.NET函数(如果我能找到的话)。根据Array.ConvertAll的文档,它应该可以做到,但我还没能让它开始工作。添加一个我认为你会喜欢的想法。@Driver,根据,
ConvertAll()
采用“一维、零基
数组
”。这个解决方案对我来说很有效,但我不得不做一些更改。1) excelArray从[1,1]开始,而新数组从[0,0]开始。因此,我必须更改for循环中的一行来考虑这个偏移量:array[I,j]=excelArray[I+1,j+1].ToString();2) 需要在创建数组的行中交换高度/宽度:var array=new string[height,width];否则,这完全符合我的需要——谢谢!很高兴我能帮忙。这些类型的数组并不常见,但框架支持它们。要处理一般情况,您需要使用
GetLowerBound
:这与我要查找的内容非常接近,但我希望.NET Framework现在已经包含类似的内容。如果我指定了多个维度,Array.ConvertAll会开始抱怨,这很奇怪。你到底为什么要在这里使用
AsQueryable
?哈。我想我在第一次学习LINQ的时候就养成了这个习惯。既然你提到这件事,那就太傻了。编辑。
public static TOutput[,] ConvertAll<TInput, TOutput>(
    this TInput[,] array, Func<TInput, TOutput> converter)
{
    int length0 = array.GetLength(0);
    int length1 = array.GetLength(1);

    var result = new TOutput[length0, length1];

    for (int i = 0; i < length0; i++)
        for (int j = 0; j < length1; j++)
            result[i, j] = converter(array[i, j]);

    return result;
}