Matrices y colecciones (Visual C# Express)

Actualización: noviembre 2007

El almacenamiento de grupos de elementos de datos relacionados es un requisito básico de casi todas las aplicaciones de software; las dos formas principales de almacenarlos son matrices y colecciones.

Las matrices son colecciones de objetos del mismo tipo. Dado que las matrices pueden tener prácticamente cualquier longitud, pueden utilizarse para almacenar miles o incluso millones de objetos, pero el tamaño debe decidirse al crear la matriz. Se tiene acceso a cada elemento de la matriz mediante un índice, que es simplemente un número que indica la posición o ranura donde el objeto está almacenado. Las matrices se pueden utilizar para almacenar tipos de referencia y tipos de valor.

Matrices unidimensionales

Una matriz es una colección indizada de objetos. Una matriz unidimensional de objetos se declara así:

type[] arrayName;

A menudo, los elementos de la matriz se inicializan al mismo tiempo, de la siguiente manera:

int[] array = new int[5];


El valor predeterminado de los elementos numéricos de la matriz es cero y los elementos de referencia cambian de forma predeterminada a null, pero los valores se pueden inicializar durante la creación de la matriz de la manera siguiente:

int[] array1 = new int[] { 1, 3, 5, 7, 9 };


O también:

int[] array2 = {1, 3, 5, 7, 9};


Las matrices utilizan índices de base cero, por lo que el primer elemento de la matriz es el elemento 0.

string[] days = {"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat"};
System.Console.WriteLine(days[0]);  // Outputs "Sun"


Matrices multidimensionales

Conceptualmente, una matriz multidimensional con dos dimensiones se asemeja a una cuadrícula. Una matriz multidimensional con tres dimensiones se asemeja a un cubo.

// declare multidimension array (two dimensions)
int[,] array2D = new int[2,3];


// declare and initialize multidimension array
int[,] array2D2 = { {1, 2, 3}, {4, 5, 6} };


// write elements in a multidimensional array
for (int i=0; i<2; i++)
{
    for (int j=0; j<3; j++)
    {
        array2D[i,j] = (i + 1) * (j + 1);
    }
}


// read elements in a multidimensional array
for (int i=0; i<2; i++)
{
    for (int j=0; j<3; j++)
    {
        System.Console.Write(array2D[i,j]);
    }
    System.Console.WriteLine();
}


Matrices escalonadas

Una variación de la matriz multidimensional es la matriz escalonada: una matriz de matrices. Una matriz escalonada es una matriz unidimensional y cada elemento es en sí mismo una matriz. No es necesario que todas las matrices de elementos sean del mismo tamaño.

Se declara una matriz escalonada así:

int[][] jaggedArray = new int[3][];


De esta manera se crea una matriz de tres matrices. Estas matrices se pueden inicializar así:

jaggedArray[0] = new int[5];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[2];


Utilizar la instrucción foreach

La instrucción foreach se utiliza a menudo para tener acceso a todos los elementos almacenados en una matriz:

int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 };
foreach (int i in numbers)
{
    System.Console.Write("{0} ", i);
}
//Output: 4 5 6 1 2 3 -2 -1 0


Matrices de objetos

La creación de una matriz de objetos, en lugar de una matriz de tipos de datos simples como enteros, es un proceso que consta de dos partes. En primer lugar, se declara la matriz y, después, se deben crear los objetos almacenados en la matriz. En este ejemplo se crea una clase que define un CD de audio. A continuación se crea una matriz que almacena 20 CDs de audio.

namespace CDCollection
{
    // Define a CD type.
    class CD
    {
        private string album;
        private string artist;
        private int rating;

        public string Album
        {
            get {return album;}
            set {album = value;} 
        }
        public string Artist
        {
            get {return artist;}
            set {artist = value;}
        }
        public int Rating
        { 
            get {return rating;} 
            set {rating = value;} 
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Create the array to store the CDs.
            CD[] cdLibrary = new CD[20];

            // Populate the CD library with CD objects.
            for (int i=0; i<20; i++)
            {
                cdLibrary[i] = new CD();
            }

            // Assign details to the first album.
            cdLibrary[0].Album = "See";
            cdLibrary[0].Artist = "The Sharp Band";
            cdLibrary[0].Rating = 10;
        }
    }
}


Una matriz es simplemente una de las muchas opciones para almacenar conjuntos de datos utilizando C#. La opción que seleccione depende de varios factores, tales como la forma en que piensa manipular o tener acceso a los elementos. Por ejemplo, utilizar una lista suele ser más rápido que utilizar una matriz si debe insertar elementos al principio o en medio de la colección. Otros tipos de clases de colección incluyen mapa, árbol y pila; cada uno tiene sus propias ventajas. Para obtener más información, vea System.Collections y System.Collections.Generic.

En el ejemplo siguiente se muestra cómo usar la clase List<T>. Observe que a diferencia de la clase Array, los elementos se pueden insertar en medio de la lista. Este ejemplo restringe los elementos de la lista a fin de que sean cadenas.

public class TestCollections
{
    public static void TestList()
    {
        System.Collections.Generic.List<string> sandwich = new System.Collections.Generic.List<string>();

        sandwich.Add("bacon");
        sandwich.Add("tomato");

        sandwich.Insert(1, "lettuce");

        foreach (string ingredient in sandwich)
        {
            System.Console.WriteLine(ingredient);            
        }
    }
}


Adiciones de comunidad

Mostrar: