将multidimensional array转换为单值,可以为空值

我主要使用ExcelDNA / C#/ Excel。 我基本上试图做的是使用以下代码将multidimensional array(即单元格的范围)转换为单数维数组:

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; } 

这工作的一种享受,并在我的项目中使用了很多次,但是我想添加一些更多的function。

当我尝试运行这个函数的范围包含一个空单元格,它错误非常可怕,目前我只是有一个错误消息的try / catch通知用户inputN / A到任何空单元格。

我真正想要做的,就是在这个函数中,可能将任何“null”或Excel存储空单元转换为文本string“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; 

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

如果你发现空值,这可能是你错误的原因,Marc的答案是正确的。 但是您可能希望在另一个上下文中使用该函数 – 直接作为Excel-DNA公开的工作表函数。

Excel-DNA编组将空Excel单元格作为ExcelDna.Integration.ExcelEmptytypes的对象清空到参数数组中。 因此,如果您的代码是直接从Excel-DNA作为工作表函数调用的,则您将从ToString()中获取types名称,而不是错误。

所以你的函数返回types改为object [](Excel-DNA不会直接注册你的string []函数)看起来像这样:

 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中给出此输出: Excel-DNA数组功能

对于这种情况,你可以添加一个检查数组项目的types来处理空单元格:

  tempList.Add( oneObj is ExcelEmpty ? "!EMPTY" : oneObj.ToString() );