Преобразование многомерного массива в одиночный, с обнуляемыми значениями - PullRequest
1 голос
/ 08 ноября 2011

Я использую 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;
}

. Это работает, и используетсясколько раз в моем проекте, однако я хотел бы добавить некоторые дополнительные функции.

Когда я пытаюсь запустить эту функцию с диапазоном, который содержит пустую ячейку, это ужасно, в настоящий момент у меня просто естьtry / catch с сообщением об ошибке, информирующим пользователя о необходимости ввода N / A в любые пустые ячейки.

Что я действительно хотел бы сделать, так это, возможно, в этой функции преобразовать любой «ноль» или все, что хранит Excelпустые ячейки относительно текстовой строки "N / A".

Ответы [ 3 ]

5 голосов
/ 08 ноября 2011

Возможно, просто:

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;

Это сокращает промежуточный список и несколько поддержкикопии массива.

2 голосов
/ 08 ноября 2011

Если вы находите нули, возможно, именно поэтому вы получаете ошибку, ответ Марка правильный. Но вы можете использовать эту функцию в другом контексте - непосредственно в качестве функции рабочего листа, предоставляемой Excel-DNA.

Маршалы Excel-DNA очищают ячейки Excel в массив аргументов как объекты типа ExcelDna.Integration.ExcelEmpty. Поэтому, если ваш код вызывается непосредственно из Excel-DNA как функция рабочего листа, вы получите имя типа из ToString (), а не ошибку.

Таким образом, ваша функция с возвращаемым типом, измененным на 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 array function

Для этого случая вы можете добавить проверку типа элемента массива для работы с пустыми ячейками:

 tempList.Add( oneObj is ExcelEmpty ? "!EMPTY" : oneObj.ToString() ); 
0 голосов
/ 03 апреля 2019
tempList.Add( oneObj.Value == null ? "!EMPTY" : oneObj.ToString() ); 
...