JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Funciones útiles para matrices en C# (I)

En Visual Basic (clásico y .NET) hay un par de funciones para tratamiento de matrices que siempre me han parecido muy útiles. Se trata de Redim y Redim Preserve. Ambas sirven para redimensionar una matriz sin tener que volver a declararla. La diferencia entre ellas estriba en que la primera crea una amtriz nueva y se pierden los elementos que contenía, mientras que la segunda (la más interesante), permite crear una matriz nueva de diferente tamaño y que conserva los elementos que ésta contuviera previamente.

En C# la primera función tiene poco sentido ya que podemos redefinir una matriz cuando queramos, por ejemplo:

int[] matriz = new int[5];
matriz = new int[8];

Ningún problema con esto. Por lo único que se me ocurre ahora mismo que podríamos necesitar la función Redim es para hacer lo anterior de forma genérica, es decir, para poder hacerlo sin importar el tipo de datos que contiene la matriz original. Esta función sería tan sencilla como la siguiente:

 private Array Redim(Array matriz, int nuevoTamanho)
 {
  return Array.CreateInstance(matriz.GetValue(0).GetType(), nuevoTamanho);
 }

Esta función crea una nueva instancia de la matriz, con el nuevo tamaño especificado y el tipo del primer elemento de la matriz original, por lo que nos puede servir perfectamente de manera genérica para re-declarar matrices sin importarnos su contenido:

Array matriz1 = new int[5];
Array matriz2 = new string[2];
matriz1 = Redim(matriz1, 10);
matriz2 = Redim(matriz2, 10);

Fíjate que las matrices ahora las he declarado de tipo genérico (Array) y no específico para poder reasignarlas. Esta función (mejor aún, la otra mencionada antes) podría resultar útil en algunos contextos en los que recibamos matrices cuyo tipo no sepamos de antemano y debamos redimensionar.

También podríamos declararla para pasar la matriz original por referencia y de este modo no tendríamos que reasignarla como en el ejemplo:

 private static void Redim(ref Array matriz, int nuevoTamanho)
 {
  matriz = Array.CreateInstance(matriz.GetValue(0).GetType(), nuevoTamanho);
 }

De este modo sólo habría que escribir:

Array matriz1 = new int[5];
Array matriz2 = new string[2];
Redim(matriz1, 10);
Redim(matriz2, 10);

Para conseguir que se redimensionen.

Con esta primera parte sólo pretendo presentar el trabajo de manera genérica con matrices en .NET y no tanto conseguir una función útil. En la entrega próxima construiré la función RedimPreserve que emulará el comportamiento de Redim Preserve en Visual Basic que sí es ya una función más útil. Construiré también unas cuantas funciones más relacionadas con el manejo genérico de matrices que seguramente resultarán de interés.

José Manuel Alarcón
Banner

Agregar comentario