Conversión de una matriz multidimensional en única, con valores que aceptan valores NULL

Estoy usando ExcelDNA / C # / Excel principalmente. Lo que esencialmente estoy tratando de hacer es convertir una matriz multidimensional (es decir, un rango de celdas) en una matriz dimensional singular, usando el siguiente código:

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

Esto funciona de maravilla y se usa varias veces a lo largo de mi proyecto, sin embargo, me gustaría agregar algo más de funcionalidad.

Cuando trato de ejecutar esta función con un rango que contiene una celda vacía, se produce un error horrible, en este momento solo tengo un intento / captura con un mensaje de error que le informa al usuario que ingrese N / A en cualquier celda vacía.

Lo que realmente me gustaría hacer, es quizás en esta función, convertir cualquier 'nulo' o lo que sea que Excel almacene celdas vacías en la cadena de texto "N / A".

preguntado el 08 de noviembre de 11 a las 10:11

3 Respuestas

Quizás solo:

tempList.Add(oneObj == null ? "n/a" : oneObj.ToString());

También puedo pensar en formas de hacerlo más eficiente, si quieres:

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

Esto elimina la lista intermedia y algunas copias de la matriz de respaldo.

respondido 08 nov., 11:14

No soy un gurú de C #, pero ¿qué (oneObj as string) ¿hacer? ¿No intentaría inferir la conversión explícita a la cadena usando el ToString() método si oneObj no es NULL? - Flindeberg

@flindeberg no, no lo haría. Si se is una cadena, devolverá la cadena. Si se no es una cadena, siempre será nula. No .ToString() etc se llamará. Entonces 123 se convertirá null. - Marc Gravell

Gracias por esto Marc, ayer no tuve la oportunidad de responder, pero esta respuesta es exactamente lo que estaba buscando. - Adam H

Si encuentra nulos, que probablemente sea la razón por la que recibe un error, la respuesta de Marc es correcta. Pero es posible que desee utilizar la función en otro contexto, directamente como una función de hoja de trabajo expuesta por Excel-DNA.

Excel-DNA calcula las celdas de Excel vacías en la matriz de argumentos como objetos de tipo ExcelDna.Integration.ExcelEmpty. Entonces, si su código se llama directamente desde Excel-DNA como una función de hoja de trabajo, obtendría el nombre del tipo de ToString (), y no un error.

Entonces, su función con el tipo de retorno cambiado a object [] (Excel-DNA no registrará su función string [] directamente) se ve así:

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

y da esta salida en Excel cuando se llama directamente como una función de hoja de trabajo: Función de matriz Excel-DNA

Para este caso, puede agregar una marca en el tipo de elemento de la matriz para tratar las celdas vacías:

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

respondido 08 nov., 11:23

¡Muy apreciado Govert! Desafortunadamente, esa opción no está abierta para mí, la solución de Marc funcionó de maravilla. - Adam H

tempList.Add( oneObj.Value == null ? "!EMPTY" : oneObj.ToString() ); 

Respondido 03 Abr '19, 11:04

Si bien este código puede resolver la pregunta, incluyendo una explicación realmente ayuda a mejorar la calidad de tu publicación. - Shree

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.