Posteado por: fzapataramirez | Sábado, agosto 9, 2008

Colecciones de datos en C#.NET (Parte I – Vectores)

Como lo explique en un post anterior, las colecciones de datos son algunas de las herramientas mas utilizadas a la hora de desarrollar una aplicación ya que nos permiten manipular información en memoria de una manera fácil y flexible.

La plataforma .NET ofrece una gran variedad de colecciones que debemos conocer y saber utilizar para emplear la mas indicada en nuestras aplicaciones y obtener así el mejor rendimiento posible tanto en procesamiento como en manejo de memoria. A continuación se explican algunas de las colecciones incluidas en el lenguaje C#.NET.

La clase Array, contenida en el namespace System, provee toda la funcionalidad necesaria en las colecciones para manipular los datos. Esta es una clase abstracta, por lo cual no es posible crear instancias de la misma, sino que sirve como clase base (de la que otras clases heredan) para las demás clases que representan colecciones en .NET

La colección mas sencilla que utiliza como clase base System.Array, es lo que se conoce comúnmente como vector. Para definir un vector, debemos tener claro que tipo de dato queremos que nuestro vector almacene y la cantidad de valores que deseamos almacenar ya que son requisitos indispensables para la definición y creación de vectores.
En C#, un vector se define con un par de corchetes [] después del tipo de dato, como se muestra a continuación.

image

Sin embargo, para hacer uso de nuestro vector, debemos primero crear la instancia declarando cuantas posiciones máximas tendrá, como se muestra a continuación:

image

Luego de esto, podremos almacenar tantos datos del mismo tipo como posiciones tenga el vector. Por ejemplo en la variable booleanos se podrá almacenar hasta 3 variables de tipo bool y en la variable texto se podrá almacenar hasta 100 variables de tipo string.
Es importante tener en cuenta que la primera posición de un vector es la posición 0, por lo cual si la longitud es de 5, las posiciones van desde la 0 hasta la 4.

Para almacenar información en un vector, solo debemos hacer referencia a la posición del vector donde deseamos almacenarla y utilizar el operador de asignación (=).

image

En el ejemplo anterior, se han almacenado 4 cadenas de texto (strings) en el vector texto declarado e instanciado anteriormente. Cada string se ha almacenado en una posición del vector diferente. En caso de almacenar un string en una posición donde ya se había almacenado anteriormente algo, el valor antiguo será sobrescrito por el nuevo valor.

A continuación se almacena en cada posición restante del vector una cadena de texto mediante un operador de control de flujo (for). Este operador es posible utilizarlo con todas las colecciones en .NET ya que todas son enumerables debido a que implementan la interface IEnumerable.

image

Un vector puede tener mas de una dimensión según sea necesario. Un vector de dos dimensiones es considerado una matriz de datos.
Para definir un vector de mas de una dimensión, se utiliza el carácter ‘,’ en los corchetes de la definición del mismo.

int [] a =new int[2]; //Una dimensión

int [ , ] a = new int [2,3]; //Dos dimensiones

int [ , , ]a = new int[2,3,4]; //Tres dimensiones

Las propiedades mas importantes que exponen los vectores se presentan a continuación:

Length: Indica la longitud total del vector (En todas las dimensiones).

Rank: Indica el numero total de dimensiones del vector.

Para obtener la longitud total de un determinada dimensión, se debe utilizar el método GetLength que recibe como parámetro un entero indicando el índice de la dimensión de la cual se desea conocer la longitud (La primera dimensión tiene como índice 0).

Aunque es posible crear vectores de mas de una dimensión, no es recomendable utilizar mucho esta técnica en las aplicaciones ya que la complejidad de nuestro algoritmo se incrementa considerablemente, teniendo en cuenta que el numero de iteraciones necesarias para recorrer todas las posiciones del vector aumenta de manera exponencial en función del numero de dimensiones. Generalmente el numero máximo de dimensiones que se utiliza en un vector es 2 cuando se necesita trabajar con matrices de datos.

A continuación se muestra un ejemplo de una matriz de datos:

image

Otra de las colecciones que se pueden crear con los vectores es un jagged array o en español un array de arrays. Se puede pensar en un jagged array como un vector de una dimensión, donde en cada posición en lugar de almacenar un tipo de dato especifico, almacena otro vector.

image 

 

En esta imagen se ilustra gráficamente como se vería un jagged  array. En este ejemplo, se tiene un vector exterior de 4 posiciones y en cada una de las posiciones almacena un vector también de 4 posiciones. No es obligación que todos los vectores sean de la misma longitud.

 

 

 

Para declarar un array de arrays en C#, se debe utilizar la siguiente sintaxis:

int [][] jagged;

Para instanciar un jagged array se debe indicar el numero de posiciones que tendrá el vector contenedor, como se hace con un vector normal de una dimensión.

int [][] jagged = new int[3][];

En el ejemplo anterior se ha definido un array de tres posiciones, donde se almacenara en cada una de ellas, un array de enteros (indicado por el segundo par de corchetes). Luego de inicializar el vector contenedor, podremos crear los vectores internos como se muestra a continuación:

 image

Igualmente se puede crear un array de arrays de varias dimensiones, donde cada vector almacenado tendrá 2, 3 o mas dimensiones según sea necesario.

image

Sin embargo, la complejidad en este caso aumenta bastante y se debe buscar siempre obtener el mejor rendimiento posible en nuestras aplicaciones, por lo tanto estas colecciones complejas deben ser utilizadas únicamente cuando sea necesario y cuando ninguna de las colecciones disponibles en la plataforma .NET es suficiente para almacenar la información.

En un próximo post explicare otra colección básica.

Suerte !!!.


Responses

  1. […] es una clase que representa una lista de datos. Es bastante parecida a la colección explicada anteriormente, con la diferencia que el ArrayList puede aumentar o disminuir su tamaño dinámicamente de […]

  2. […] de las ventajas que presenta ésta colección frente a las colecciones mencionadas anteriormente (Parte I: Vectores, Parte II: ArrayList, Parte III: Stack y Queue), es el poco tiempo que tarda en realizar la […]

  3. la parte de vectores es muy interesante y este ejemplo es demaciado bueno como en el explicado de arraylist gracias por los ejemplos 🙂 buen dia, hasta pronto

  4. […] o trabajar con objetos pesados si no se van a usar, castings innecesarios, uso adecuado de las colecciones de datos, promover el uso de arraylist en lugar de otras estructuras más rígidas o pesadas,… pero de […]

  5. Hola brother, oye entonces en si no existe la clase vector como tal en .NET en Java existe la clase Vector bien definida con sus metodos y propiedades. Por lo que veo aqui en .NET Vector es mas bien lo que se conoce como un Arreglo en programación. salu2

    • Eso es correcto.

      El equivalente en .NET de la clase Vector en Java seria la clase ArrayList. Porque si no estoy mal, Vector en java se puede redimensionar automaticamente.

      Saludos

  6. y también arreglo de arreglos…

    Esto es un Vector en Java y es muy poderoso:

    Vector x = new Vector();
    x.addElement(1);
    x.addElement(2);
    x.addElement(3);

    entonces:
    x = (1,2,3)

    Otro ejemplo:

    Vector x = new Vector(1,2,3);
    Vector y = new Vector(5,6,7);
    Vector z = new Vector(8,9,10);

    Vector alfa = new Vector(x,y,z);

    entonces:

    alfa = ( (1,2,3), (4,5,6), (7,8,9) )

    Esto existe en .NET? se puede implementar????

    Salu2😉

    • Claro que si.

      Con la clase ArrayList. Funciona exactamente igual.

      ArrayList lista = new ArrayList();
      lista.Add(1);
      lista.Add(2);
      lista.Add(3);

      ArrayList lista2=new ArrayList();
      lista2.Add(lista);

      Pero te recomiendo que leas mi post de Colecciones genericas ya que te daras cuenta que aunque la clase Vector o ArrayList sea muy util en muchas ocasiones, es preferible utilizar las colecciones genericas por cuestiones de rendimiento.

      saludos

  7. sobre un arreglo con instrucciones o código independiente por ejemplo condiciones, mas explicitamente; si tuviese que trabajar con punteros y a donde apunta este cambiará dependiendo del desarrollo en la aplicación, entonces apuntará a diferentes casillas del arreglo donde habria difrentes condiciones.
    algo que aporten??? 😀

  8. Tengo un vector de esta manera
    1234
    y necesito imprimirlo asi desde la ultima posicion a la primera asi
    4321
    pero no se como hacerlo, me pueden ayudar??

  9. alguien me daria su correo para ke me ayude con programacion


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: