jueves, 8 de mayo de 2014

Receta No. 2-10 en C#: Copiar una Colección a un Arreglo

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

En esta receta vamos a explorar otras de las utilidades de arreglos: copiado de elementos de un colección a un arreglo. Este proceso nos puede resultar útil en situaciones donde los elementos de una colección se  manipulen mejor en arreglos: límite en la memoria de trabajo, o una imposición por un algoritmo personalizado creado por programador que requiera tratar el contenido del arreglo según unas reglas establecidas en el diseño de un algoritmo en particular.

1. Problema

Buscar aquellos métodos que permitan copiar los elementos (contenido) de una colección a una arreglo estándar (array) en la Microsoft Developer Network (MSDN).

2. Solución

El método ToArray de las clases Queue, Stack, y ArrayList podemos utilizarlo para generar un arreglo estándar a partir de este tipo de estructuras de datos. Por otro lado, el método CopyTo de la interfaz ICollection es capaz de generar una copia de los elementos de una colección que implemente la interfaz sobre un arreglo estándar. (En la siguiente sección veremos cuáles firmas posee este último método).

3. Discusión de la Solución

De acuerdo con [7]ICollection.ToArray copia el contenido (elementos) de una colección a un arreglo. Antes de continuar incluyo la firma este método abstracto:

void CopyTo(Array array, int index)

Descripción de los parámetros:
  • array: Arreglo estándar unidimensional de destino.
  • index: Índice (posición) del arreglo destino desde donde se empezará a copiar el contenido de la colección.
Uno de los requisitos de este método consiste en que el arreglo destino debe existir en memoria. Como veremos más adelante, esto no ocurre con el método ToArray.

Algunas excepciones pueden llegar a lanzarse en caso de inconsistencias:
  • La excepción System.InvalidCastException [10] se genera cuando el tipo del arreglo destino (array) no corresponde con el tipo de los elementos en la colección origen.
  • Este método trabaja sobre un arreglo existente, de esto se desprende que si el arreglo destino (array) no cuenta con la capacidad de elementos igual o inferior al número de elementos de la colección origen, la excepción System.ArgumentException [11], es lanzada.
Por otra parte, el método ToArray posee las siguientes firmas:

public virtual Object[] ToArray()


Esta versión sobrecargada genera un nuevo arreglo de objectos Object -cfr. La Clase Object y sus Miembros en C#-. No requiere de ningún argumento. Mientras que, 

public virtual Array ToArray(Type type)

Descripción firma:
  • Genere un arreglo de tipo Array [8] con elementos del tipo Type [9].
Este método sobrecargado es miembro de las clases ArrayList [5], Stack [4], y Queue [3].

Finalmente, vale mencionar de que que las copias generadas por estos dos arreglos son shallow (es decir, las campos no estáticos: tipos por valor se copian bit-a-bit (copia exacta), mientras que los de tipo por referencia, sólo se copia el apuntador (referencia) al objeto, y no los datos de éste).

4. Práctica: Código Fuente C#

Demostraré en esta sección el uso de los métodos CopyTo de ICollection, y ToArray de ArrayList.


Véase en la línea 50 el uso de la versión sobrecargada public virtual Array ToArray(Type type) de la clase ArrayList: debido a que nuestro arreglo original es de tipo double especificamos typeof(double)  como argumento, y además hacemos una conversión explícita (double[]) para el tipo correspondiente.

Compilación:


  1. csc /target:exe UsoMetodoCopyToArray.cs

> Prueba de ejecución.

Resultados:

Contenido del arreglo `constMatematicas`:
 0.577215664901
 1.618033988
 3.14159265358979
 2.71828182845905
 1.414213562

Contenido del arreglo de objectos Object `arregloObjetos`:
 0.577215664901
 1.618033988
 3.14159265358979
 2.71828182845905
 1.414213562

Contenido del arreglo `constMatematicas2`:
 0.577215664901
 1.618033988
 3.14159265358979
 2.71828182845905
 1.414213562

5. Conclusiones

Hemos comprendido el uso de los métodos CopyTo y ToArray de los tipos ICollection y ArrayList, respectivamente, para la copia de elementos de una colección a un arreglo estándar. Esta receta nos ha servido además para comprender los detalles programáticos (excepciones, usos) de los métodos mencionados de manera pormenorizada.

6. Glosario

  • Array
  • Arreglo
  • Colección
  • Collection
  • Copiar
  • Elemento

7. Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: ArrayList.ToArray Method (System.Collections) - http://msdn.microsoft.com/en-us/library/h6ds1b65%28v=vs.110%29.aspx
[3]: Queue Class (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.queue%28v=vs.110%29.aspx
[4]: Stack Class (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.stack%28v=vs.110%29.aspx
[5]: ArrayList Class (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.arraylist%28v=VS.100%29.aspx
[6]: ICollection Interface (System.Collections) - http://msdn.microsoft.com/en-us/library/System.Collections.ICollection%28v=vs.110%29.aspx
[7]: ICollection.CopyTo Method (System.Collections) - http://msdn.microsoft.com/en-us/library/system.collections.icollection.copyto%28v=vs.110%29.aspx
[8]: Array Class (System) - http://msdn.microsoft.com/en-us/library/system.array(v=vs.110).aspx
[9]: Type Class (System) - http://msdn.microsoft.com/en-us/library/system.type(v=vs.110).aspx
[10]: InvalidCastException Class (System) - http://msdn.microsoft.com/en-us/library/system.invalidcastexception%28v=vs.110%29.aspx
[11]: ArgumentException Class (System) - http://msdn.microsoft.com/en-us/library/system.argumentexception%28v=vs.110%29.aspx
[12]: Shallow Copy vs. Deep Copy in .NET - http://www.codeproject.com/Articles/28952/Shallow-Copy-vs-Deep-Copy-in-NET?fid=1525916&df=90&mpp=25&noise=3&prof=False&sort=Position&view=Normal&spc=Relaxed&fr=14


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.