You are on page 1of 31

Tutorial de C# Arreglos y Colecciones

Por: scar Lpez, M.Sc. olopez@uniandino.com.co

ARREGLOS

OALP-2004 All Rights Reserved

Arreglos

Un arreglo es el tipo de coleccin ms simple, soportado directamente por el lenguaje Se trata de un secuencia de objetos del mismo tipo que pueden ser accedidos por medio de un ndice Cuando se declara un arreglo, realmente se est instanciando un objeto de una sub-clase de System.Array, que implementa ICloneable, IList, Icollection e IEnumerable Se cuenta con Lo mejor de dos mundos: una sintaxis familiar para declarar arreglos y la definicin de una clase que brinda acceso a un conjunto de mtodos y propiedades comunes a todos los arreglos Se pueden efectuar conversiones de tipo entre arreglos, siempre que sus dimensiones sean iguales y sea posible convertir (implcita o explcitamente) entre los tipos de sus elementos
OALP-2004 All Rights Reserved

Arreglos - Declaracin
[[atributos]] [modificadores] tipo[] nombre;

Los [] indican al compilador que se est declarando un arreglo, y se los conoce como el operador ndice. El tipo indica el tipo de elementos que puede contener el arreglo Se instancian usando la palabra clave new Los arreglos son tipos referencia y se crean en el heap. Los elementos del arreglo se crean en la pila o en el heap, segn se traten de tipos valor o tipos referencia respectivamente

OALP-2004 All Rights Reserved

Arreglos - Inicializacin y Acceso

En el momento de instanciar un arreglo sus elementos quedan inicializados en los valores por defecto correspondientes a su tipo
string[] miArreglo; miArreglo = new string[10];

Pueden ser inicializados explcitamente en el momento de su declaracin:


int[] miArreglo = new int[5] { 2, 4, 6, 8, 10 }; int[] miArreglo = { 2, 4, 6, 8, 10 };

El ndice de los arreglos empieza en 0 y los elementos se acceden usando la sintaxis nombre[i], donde i es el elemento ubicado en la posicin i+1 dentro del arreglo Si se trata de acceder un elemento por fuera del rango de un arreglo, la excepcin IndexOutOfRangeException ser lanzada
OALP-2004 All Rights Reserved

Clase System.Array
Mtodo o Propiedad IsFixedSize Length Rank Clear() Copy() IndexOf() LastIndexOf() Reverse() Sort() Descripcin
Propiedad que indica si el arreglo es de tamao fijo Propiedad que retorna el tamao del arreglo Propiedad que retorna el nmero de dimensiones del arreglo Establece el valor de un rango de elementos de un arreglo en 0 o null Copia una seccin de un arreglo a otro arreglo Retorna el ndice de la primera ocurrencia de un valor en un arreglo unidimensional Retorna el ndice de la ltima ocurrencia de un valor en un arreglo unidimensional Invierte el orden de los elementos en un arreglo unidimensional Ordena los elementos (que deben implementar IComparable) de un arreglo unidimensional usando el algoritmo Quicksort
OALP-2004 All Rights Reserved

Array - Propiedad Length


Indica cuntos objetos hay en un arreglo, retornando el tamao total de ste En el caso de un arreglo multidimensional, retorna el tamao total de todo el arreglo no el tamao de su primer nivel
1. using System; 2. public class TestLength { 3. 4. 5. 6. 7. 8. 9. 10. } int[,] MyArray = new int[2,5]; public static void Main() { TestLength c = new TestLength(); Console.WriteLine(c.MyArray.Length); Console.WriteLine(c.MyArray.GetLength(0)); Console.WriteLine(c.MyArray.GetLength(1)); }

OALP-2004 All Rights Reserved

Array - Ejemplo
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

using System; public class Tester { static void Main() { String[] myArray = {"Who", "is", "John", "Doe"}; PrintMyArray(myArray); Array.Reverse(myArray); PrintMyArray(myArray); String[] myOtherArray = {"We", "Hold", "These", "Truths", "To", "Be", "Self", "Evident"}; PrintMyArray(myOtherArray); Array.Sort(myOtherArray); PrintMyArray(myOtherArray); Console.ReadLine(); } public static void PrintMyArray(object[] theArray) { foreach (object obj in theArray) Console.WriteLine("Value: {0}", obj); Console.WriteLine(); } } OALP-2004 All Rights Reserved

Arreglos Multidimensionales

OALP-2004 All Rights Reserved

Arreglos Rectangulares
[[atributos]] [modificadores] tipo[,] nombre;

Un arreglo rectangular es un arreglo de dos o ms dimensiones. En uno de dos dimensiones, la primera es el numero de filas y la segunda el nmero de columnas El nmero de , en la declaracin indica el nmero de dimensiones del arreglo Los elementos se acceden usando la sintaxis
nombre[i,j]
OALP-2004 All Rights Reserved

Arreglos Rectangulares - Ejemplo


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.

using System; class Tester { public void Run() { const int rows = 4; const int columns = 3; // declara un arreglo rectangular 4x3 de enteros int[,] rectangularArray = { {0,1,2}, {3,4,5}, {6,7,8}, {9,10,11} }; // imprime el contenido del arreglo for (int i = 0; i < rows; i++) for (int j = 0; j < columns; j++) Console.WriteLine("[{0},{1}] = {2}", i, j, rectangularArray[i,j]); } static void Main() { Tester t = new Tester(); t.Run(); Console.ReadLine(); } }

OALP-2004 All Rights Reserved

Arreglos Serrados
[[atributos]] [modificadores] tipo[][] nombre;

Cada fila puede tener un nmero diferente de columnas Un arreglo serrado puede entenderse como un arreglo en donde cada uno de sus elementos es un arreglo Al momento de declararlos, se debe indicar el nmero de filas El nmero de [] en la declaracin indica el nmero de dimensiones del arreglo Tambin pueden inicializarse en la declaracin:
int[][] miArreglo = new int[2][] { new int[] {1,2,3}, new int[] {4,5,6,7,8} };

Los elementos se acceden usando la sintaxis


nombre[i][j]
OALP-2004 All Rights Reserved

Arreglos Serrados - Ejemplo


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.

using System; class Tester { public void Run() { const int rows=4, rowZero=5, rowOne=2, rowTwo=3, rowThree=5; // declara un arreglo serrado de cuatro filas int[][] jaggedArray = new int[rows][]; // declara cada fila jaggedArray[0] = new jaggedArray[1] = new jaggedArray[2] = new jaggedArray[3] = new con tamaos distintos int[rowZero]; int[rowOne]; int[rowTwo]; int[rowThree];

// llena algunas (pero no todas las) posiciones jaggedArray[0][3] = 15; jaggedArray[1][1] = 12; jaggedArray[2][1] = 9; jaggedArray[2][2] = 99; jaggedArray[3][0] = 10; jaggedArray[3][1] = 11; jaggedArray[3][2] = 12; jaggedArray[3][3] = 13; jaggedArray[3][4] = 14; for(int for(int for(int for(int } static void Main() { new Tester().Run(); Console.ReadLine(); } } i=0;i<rowZero;i++) i=0;i<rowOne;i++) i=0;i<rowTwo;i++) i=0;i<rowThree;i++) Console.WriteLine("[0][{0}] Console.WriteLine("[1][{0}] Console.WriteLine("[2][{0}] Console.WriteLine("[3][{0}] = = = = {1}",i,jaggedArray[0][i]); {1}",i,jaggedArray[1][i]); {1}",i,jaggedArray[2][i]); {1}",i,jaggedArray[3][i]);

OALP-2004 All Rights Reserved

COLECCIONES

OALP-2004 All Rights Reserved

Colecciones

Una coleccin es un contenedor que alberga un grupo de objetos El framework .NET proporciona varias clases que implementan la funcionalidad de una coleccin Igualmente, proporciona un conjunto de interfaces estndar para enumerar, comparar y crear colecciones Se aconseja estudiar el espacio de nombres System.Collections para profundizar en el tema de las colecciones
OALP-2004 All Rights Reserved

Interfaces tiles
Interfaz
ICollection

Mtodos
int Count {get;} bool IsSynchronized {get;} object SyncRoot {get;} void CopyTo(Array array, int index) int Compare(object x, object y) IEnumerator GetEnumerator() object Current {get;} bool MoveNext() void Reset() object Key {get;} object Value {get;}

IComparer IEnumerable IEnumerator

IDictionaryEnumerator DictionaryEntry Entry {get;}

IHashCodeProvider

int GetHashCode(object obj)


OALP-2004 All Rights Reserved

Interfaces tiles
Interfaz
IList

Mtodos
bool IsFixedSize {get;} bool IsReadOnly {get;} object this[int index] {get; set;} int Add(object value) void Clear() bool Contains(object value) int IndexOf(object value) void Insert(int index, object value) void Remove(object value) void RemoveAt(int index) bool IsFixedSize {get;} bool IsReadOnly {get;} object this[object key] {get; set;} ICollection Keys {get;} ICollection Values {get;} void Add(object key, object value) void Clear(); bool Contains(object key) IDictionaryEnumerator GetEnumerator(); void Remove(object key) OALP-2004 All Rights Reserved

IDictionary

IComparer e IComparable

La interfaz IComparer proporciona el mtodo Compare() por medio del cual dos objetos cualquiera en una coleccin pueden ser ordenados Tpicamente, IComparer es implementado en clases auxiliares, cuyas instancias son pasadas como parmetros a mtodos como
Array.Sort(Array a, IComparer c) El framework .NET provee las clases Comparer y CaseInsensitiveComparer que implementan IComparer y

permiten efectuar comparaciones de cadenas de caracteres teniendo o no en cuenta maysculas/minsculas, respectivamenteLa interfaz IComparable es similar, pero define CompareTo() en el mismo objeto que va a ser comparado y no en una clase auxiliar La ventaja de tener una clase auxiliar implementando IComparer es que permite tener un mayor control sobre la forma en que se efecta el ordenamiento. Por ej., es posible definir varios criterios distintos para ordenar una coleccin de objetos del mismo tipo
OALP-2004 All Rights Reserved

IEnumerable e IEnumerator

Las instancias de colecciones que implementan IEnumerable pueden ser recorridas fcilmente usando foreach Adems de una clase que implemente IEnumerable, se necesita otra clase auxiliar que implemente IEnumerator La responsabilidad del enumerador ser la de proporcionar los mtodos necesarios para recorrer una coleccin: Current, MoveNext() y Reset()
OALP-2004 All Rights Reserved

IEnumerable e IEnumerator - Ejemplo


1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

using System; using System.Collections; class TestForeach { static void Main() { string s = "abc123"; Console.WriteLine(s is IEnumerable + "\n"); foreach (char c in s) Console.WriteLine(c); Console.WriteLine("\n---\n"); IEnumerator ie = s.GetEnumerator(); while (ie.MoveNext()) { char c = (char) ie.Current; Console.WriteLine(c); } Console.ReadLine(); } }

OALP-2004 All Rights Reserved

IDictionary e IDictionaryEnumerator

Las clases que implementan IDictionary permiten representar una coleccin que asocia un valor a una determinada llave y se las conoce como Diccionarios Dichas clases tambin pueden ser enumeradas usando foreach, pero con una diferencia: el mtodo GetEnumerator() retorna un objeto que implementa
IDictionaryEnumerator

Un Diccionario puede verse como un conjunto de objetos que encapsulan una pareja llave-valor Los objetos que implementen IDictionaryEnumerator son consistentes con esta idea: un diccionario es enumerado recorriendo instancias de la estructura DictionaryEntry, que encapsulan una llave y su respectivo valor
OALP-2004 All Rights Reserved

Clase System.Collections.ArrayList
Mtodo o Propiedad Capacity Count Item Add() Clear() GetEnumerator() Insert() RemoveAt() Reverse() Sort() ToArray() Descripcin
Propiedad que indica el nmero de elementos que actualmente puede contener el ArrayList Propiedad que retorna el nmero de elementos en la coleccin Indexador de la clase ArrayList Aade un objeto al final Remueve todos los elementos Retorna el enumerador Inserta un elemento en un ndice dado Remueve un elemento de un ndice dado Invierte el orden de los elementos Ordena los elementos usando Quicksort Copia todos los elementos a un nuevo arreglo
OALP-2004 All Rights Reserved

ArrayList - Ejemplo
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.

using System; using System.Collections; public class Employee { private int empID; public Employee(int empID) { this.empID = empID; } public override string ToString() { return empID.ToString(); } } public class Tester { static void Main() { ArrayList empArray = new ArrayList(); ArrayList intArray = new ArrayList(); // Llenamos los arreglos for (int i = 0; i < 5; i++) empArray.Add(new Employee(i+100)); for (int i = 0; i < 17; i++) intArray.Add(i); // Imprimimos el contenido del ArrayList de enteros for (int i = 0; i < intArray.Count; i++) Console.Write("{0} ", intArray[i]); Console.WriteLine("\n\nintArray.Capacity: {0}", intArray.Capacity); // Imprimimos el contenido del ArrayList de empleados for (int i = 0; i < empArray.Count; i++) Console.Write("{0} ", empArray[i]); Console.WriteLine("\n\nempArray.Capacity: {0}", empArray.Capacity); Console.ReadLine(); } }

OALP-2004 All Rights Reserved

Clase System.Collections.Queue
Mtodo o Propiedad Count Clear() Contains() CopyTo() Dequeue() Enqueue() GetEnumerator() Peek() ToArray() Descripcin
Propiedad que retorna el nmero de elementos en la coleccin Remueve todos los elementos Determina si un elemento est en la cola Copia un rango de elementos a un arreglo ya existente Remueve y retorna el objeto al comienzo de la cola Aade un objeto al final de la cola Retorna el enumerador Retorna el objeto al comienzo de la cola sin removerlo Copia todos los elementos a un nuevo arreglo

OALP-2004 All Rights Reserved

Queue - Ejemplo
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

using System; using System.Collections; public class Tester { static void Main() { Queue intQueue = new Queue(); // Pone elementos en la cola for (int i = 0; i < 5; i++) intQueue.Enqueue(i*5); PrintValues(intQueue); // Remueve un elemento de la cola Console.WriteLine("\n(Dequeue)\t{0}", intQueue.Dequeue()); PrintValues(intQueue); // Mira el primer elemento de la cola sin removerlo Console.WriteLine("\n(Peek) \t{0}", intQueue.Peek()); PrintValues( intQueue ); Console.ReadLine(); } public static void PrintValues(IEnumerable myCollection) { Console.Write("intQueue values:\t"); foreach (object o in myCollection) Console.Write("{0} ", o); Console.WriteLine(); } }

OALP-2004 All Rights Reserved

Clase System.Collections.Stack
Mtodo o Propiedad Count Clear() Contains() CopyTo() GetEnumerator() Peek() Pop() Push() ToArray() Descripcin
Propiedad que retorna el nmero de elementos en la coleccin Remueve todos los elementos Determina si un elemento est en la pila Copia un rango de elementos a un arreglo ya existente Retorna el enumerador Retorna el objeto en la parte superior de la pila sin removerlo Remueve y retorna el objeto en la parte superior de la pila Aade un objeto en la parte superior de la pila Copia todos los elementos a un nuevo arreglo

OALP-2004 All Rights Reserved

Stack - Ejemplo
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

using System; using System.Collections; class Tester { public static void Main() { Stack intStack = new Stack(); // Pone elementos en la pila for (int i = 0; i < 8; i++) intStack.Push(i*5); PrintValues(intStack); // Remueve un elemento de la pila Console.WriteLine("\n(Pop)\t{0}", intStack.Pop()); PrintValues(intStack); // Mira el primer elemento de la pila sin removerlo Console.WriteLine("\n(Peek) \t{0}", intStack.Peek()); PrintValues(intStack); Console.ReadLine(); } public static void PrintValues(IEnumerable myCollection) { Console.Write("intStack values:\t"); foreach (object o in myCollection) Console.Write("{0} ", o); Console.WriteLine(); } }

OALP-2004 All Rights Reserved

Clase System.Collections.Hashtable
Mtodo o Propiedad Count Keys Values Item Add() Clear() ContainsKey() ContainsValue() CopyTo() GetEnumerator() Remove() Descripcin
Propiedad que retorna el nmero de elementos en la coleccin Retorna una ICollection con las llaves de la Hashtable Retorna una ICollection con los valores de la Hashtable Indexador de la clase Hashtable Aade una entrada con la llave y el valor especificados Remueve todos los elementos Determina si la Hashtable contiene una llave especificada Determina si la Hashtable contiene un valor especificado Copia un rango de elementos a un arreglo ya existente Retorna el enumerador Remueve una entrada con la llave especificada
OALP-2004 All Rights Reserved

Hashtable

Un tipo de diccionario optimizado para recuperar rpidamente los valores Tanto llaves como valores pueden ser cualquier Object o tipo bsico Por defecto, se usa el mtodo GetHashCode() como funcin de hashing y el mtodo Equals() para determinar si dos objetos son iguales, ambos heredados de Object Tambin se puede implementar la interfaz IHashCodeProvider para definir una nueva funcin de hashing CaseInsensitiveHashCodeProvider implementa dicha interfaz para calcular un hash de cadenas de caracteres que no tenga en cuenta maysculas/minsculas Recordar que se pueden probar distintos valores de capacidad y factor de carga para acomodar la Hashtable a la coleccin de elementos que se quieren almacenar y lograr un buen balance entre: minimizar colisiones, maximizar el uso eficiente de la memoria y acceder rpidamente los valores almacenados
OALP-2004 All Rights Reserved

Hashtable - Ejemplo
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.

using System; using System.Collections; public class TestClass { public static void Main() { Hashtable ht = new Hashtable(); // Usando Add() ht.Add("A", "apple"); ht.Add("D", "durian"); ht.Add("B", "banana"); ht.Add("C", "coconut"); PrintCollection(ht); // Usando la propiedad Count Console.WriteLine("Count: {0}\n", ht.Count); // Usando ContainsKey() Console.WriteLine(ht.ContainsKey("D")); Console.WriteLine(ht.ContainsKey("S") + "\n"); // Usando ContainsValue() Console.WriteLine(ht.ContainsValue("banana")); Console.WriteLine(ht.ContainsValue("starfruit") + "\n"); // Usando Remove() ht.Remove("B"); PrintCollection(ht); // Usando la propiedad Keys foreach (string key in ht.Keys) Console.WriteLine(key); // Usando la propiedad Values() Console.WriteLine(); foreach (string val in ht.Values) Console.WriteLine(val); Console.ReadLine(); } public static void PrintCollection(IEnumerable myCollection) { foreach (DictionaryEntry de in myCollection) Console.WriteLine("Key: {0} Value: {1}", de.Key, de.Value); Console.WriteLine(); } }

OALP-2004 All Rights Reserved

Colecciones - Usos Avanzados

Todas las clases que implementan ICollection tienen mtodos para trabajar con versiones sincronizadas de stas BitArray es una coleccin similar a ArrayList, diseada para trabajar con bits representados como valores booleanos SortedList es un hbrido entre Hashtable y Array, almacena llaves-valores, pero sus llaves estn ordenadas. Sus valores pueden recuperarse usando llaves o ndices Estudiar el espacio de nombres System.Collections.Specialized. Cuenta con colecciones especializadas y optimizadas para trabajar con un tipo de datos determinado, por ej., cadenas de texto
OALP-2004 All Rights Reserved

You might also like