C# 将多维数组转换为具有可空值的单个数组

C# 将多维数组转换为具有可空值的单个数组,c#,excel,excel-dna,C#,Excel,Excel Dna,我主要使用ExcelDNA/C#/Excel。基本上,我尝试使用以下代码将多维数组(即一系列单元格)转换为奇异维数组: private static string[] MultiToSingle(object[,] multiArray) { List<string> tempList; string[] returnArray; tempList = new List<string>(); //Add each element of the m

我主要使用ExcelDNA/C#/Excel。基本上,我尝试使用以下代码将多维数组(即一系列单元格)转换为奇异维数组:

private static string[] MultiToSingle(object[,] multiArray)
{
   List<string> tempList;
   string[] returnArray;
   tempList = new List<string>();

   //Add each element of the multi-dimensional Array to the list
   foreach (object oneObj in multiArray)
   {
      tempList.Add(oneObj.ToString());
   }
   //Convert the list to a single dimensional array
   returnArray = tempList.ToArray();
   return returnArray;
}
private static string[]MultiToSingle(对象[,]multiArray)
{
圣殿骑士名单;
字符串[]返回数组;
tempList=新列表();
//将多维数组的每个元素添加到列表中
foreach(多数组中的对象oneObj)
{
Add(oneObj.ToString());
}
//将列表转换为一维数组
returnArray=templast.ToArray();
返回数组;
}
这是一种享受,在我的整个项目中使用了很多次,但是我想添加一些更多的功能

当我尝试在包含空单元格的区域中运行此函数时,它会出现可怕的错误,此时我只收到一条try/catch错误消息,通知用户在任何空单元格中输入N/a

我真正想做的,可能是在这个函数中,将任何“null”或Excel存储的空单元格转换为文本字符串“N/A”。

可能只是:

tempList.Add(oneObj == null ? "n/a" : oneObj.ToString());
如果您愿意,我还可以想办法提高效率:

string[] arr = new string[multiArray.Length];
int i = 0;
foreach (object oneObj in multiArray)
{
    arr[i++] = oneObj == null ? "n/a" : oneObj.ToString();
}
return arr;
这将删除中间列表和一些备份阵列副本。

可能只是:

tempList.Add(oneObj == null ? "n/a" : oneObj.ToString());
如果您愿意,我还可以想办法提高效率:

string[] arr = new string[multiArray.Length];
int i = 0;
foreach (object oneObj in multiArray)
{
    arr[i++] = oneObj == null ? "n/a" : oneObj.ToString();
}
return arr;

这将删除中间列表和一些备份数组副本。

如果您正在查找空值,这可能就是为什么会出现错误,Marc的答案是正确的。但您可能希望在另一个上下文中使用该函数—直接作为Excel DNA公开的工作表函数

Excel DNA将空白Excel单元格作为ExcelDna.Integration.ExcelEmpty类型的对象封送到参数数组中。因此,如果您的代码作为工作表函数直接从Excel DNA调用,那么您将从ToString()获得类型名称,而不是错误

因此,返回类型更改为object[](Excel DNA不会直接注册字符串[]函数)的函数如下所示:

public static object[] MultiToSingle(object[,] multiArray)
{
   List<string> tempList;
   object[] returnArray;
   tempList = new List<string>();

   //Add each element of the multi-dimensional Array to the list
   foreach (object oneObj in multiArray)
   {
      tempList.Add(oneObj.ToString());
   }
   //Convert the list to a single dimensional array
   returnArray = tempList.ToArray();
   return returnArray;
}

如果你正在寻找空值,这可能就是你得到错误的原因,马克的答案是正确的。但您可能希望在另一个上下文中使用该函数—直接作为Excel DNA公开的工作表函数

Excel DNA将空白Excel单元格作为ExcelDna.Integration.ExcelEmpty类型的对象封送到参数数组中。因此,如果您的代码作为工作表函数直接从Excel DNA调用,那么您将从ToString()获得类型名称,而不是错误

因此,返回类型更改为object[](Excel DNA不会直接注册字符串[]函数)的函数如下所示:

public static object[] MultiToSingle(object[,] multiArray)
{
   List<string> tempList;
   object[] returnArray;
   tempList = new List<string>();

   //Add each element of the multi-dimensional Array to the list
   foreach (object oneObj in multiArray)
   {
      tempList.Add(oneObj.ToString());
   }
   //Convert the list to a single dimensional array
   returnArray = tempList.ToArray();
   return returnArray;
}

我不是C#guru,但是
(oneObj作为字符串)
会做什么呢?如果
oneObj
不为NULL,它是否会尝试使用
ToString()
方法推断显式转换为字符串?@flindeberg不,它不会。如果是字符串,它将返回字符串。如果它不是字符串,它将始终为空。不会调用
.ToString()
等。所以
123
将变为
null
。感谢这个Marc,昨天没有机会回复,但这个答案正是我想要的。我不是C#guru,但是
(oneObj as string)
该怎么办?如果
oneObj
不为NULL,它是否会尝试使用
ToString()
方法推断显式转换为字符串?@flindeberg不,它不会。如果是字符串,它将返回字符串。如果它不是字符串,它将始终为空。不会调用
.ToString()
等。所以
123
将变为
null
。感谢这份Marc,昨天没有机会回复,但这正是我想要的答案。非常感谢Govert!不幸的是,这个选择对我来说并不开放,马克的解决方案很有效。非常感谢戈弗特!不幸的是,这个选项对我来说并不开放,Marc的解决方案非常有效。虽然这段代码可以解决这个问题,但确实有助于提高你的文章质量。虽然这段代码可以解决这个问题,但确实有助于提高你的文章质量。