Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010


(Nota: Estás viendo una versión del curso antigua, creada en 2009. Es recomendable que sigas la versión 2015, mucho más actualizada, con contenidos más detallados, más ejemplos y más ejercicios propuestos)

8.4. Las listas

Una lista es una estructura dinámica en la que se puede añadir elementos sin tantas restricciones. Es habitual que se puedan introducir nuevos datos en ambos extremos, así como entre dos elementos existentes, o bien incluso de forma ordenada, de modo que cada nuevo dato se introduzca automáticamente en la posición adecuada para que todos ellos queden en orden.

En el caso de C#, no tenemos ninguna clase "List" que represente una lista genérica, pero sí dos variantes especialmente útiles: una lista ordenada ("SortedList") y una lista a cuyos elementos se puede acceder como a los de un array ("ArrayList").

8.4.1. ArrayList

En un ArrayList, podemos añadir datos en la última posición con "Add", insertar en cualquier otra con "Insert", recuperar cualquier elemento usando corchetes, o bien ordenar toda la lista con "Sort". Vamos a ver un ejemplo de la mayoría de sus posibilidades:

/*---------------------------*/
/*  Ejemplo en C#            */
/*  arrayList1.cs            */
/*                           */
/*  Ejemplo de ArrayList     */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
using System.Collections;
 
public class ejemploArrayList1  {
 
   public static void Main()  {
 
      ArrayList miLista = new ArrayList();
      // Añadimos en orden
      miLista.Add("Hola,");
      miLista.Add("soy");
      miLista.Add("yo");
 
      // Mostramos lo que contiene
      Console.WriteLine( "Contenido actual:");
      foreach (string frase in miLista) 
        Console.WriteLine( frase );
 
      // Accedemos a una posición
      Console.WriteLine( "La segunda palabra es: {0}", 
        miLista[1] );
 
      // Insertamos en la segunda posicion
      miLista.Insert(1, "Como estas?");  
 
      // Mostramos de otra forma lo que contiene
      Console.WriteLine( "Contenido tras insertar:");
      for (int i=0; i<miLista.Count; i++) 
        Console.WriteLine( miLista[i] );
 
      // Buscamos un elemento
      Console.WriteLine( "La palabra \"yo\" está en la posición {0}", 
        miLista.IndexOf("yo") );
 
      // Ordenamos
      miLista.Sort();
 
      // Mostramos lo que contiene
      Console.WriteLine( "Contenido tras ordenar");
      foreach (string frase in miLista) 
        Console.WriteLine( frase );
 
      // Buscamos con búsqueda binaria
      Console.WriteLine( "Ahora \"yo\" está en la posición {0}", 
        miLista.BinarySearch("yo") );
 
      // Invertimos la lista
      miLista.Reverse();
 
      // Borramos el segundo dato y la palabra "yo"
      miLista.RemoveAt(1);
      miLista.Remove("yo");
 
      // Mostramos nuevamente lo que contiene
      Console.WriteLine( "Contenido dar la vuelta y tras eliminar dos:");
      foreach (string frase in miLista) 
        Console.WriteLine( frase );
 
      // Ordenamos y vemos dónde iría un nuevo dato
      miLista.Sort();
      Console.WriteLine( "La frase \"Hasta Luego\"...");
      int posicion = miLista.BinarySearch("Hasta Luego");
      if (posicion >= 0)
        Console.WriteLine( "Está en la posición {0}", posicion );
      else
        Console.WriteLine( "No está. El dato inmediatamente mayor es el {0}: {1}", 
        ~posicion, miLista[~posicion] );
 
   }
 
}
 

El resultado de este programa es:


Contenido actual:
Hola,
soy
yo
La segunda palabra es: soy
Contenido tras insertar:
Hola,
Como estas?
soy
yo
La palabra "yo" está en la posición 3
Contenido tras ordenar
Como estas?
Hola,
soy
yo
Ahora "yo" está en la posición 3
Contenido dar la vuelta y tras eliminar dos:
Hola,
Como estas?
La frase "Hasta Luego"...
No está. El dato inmediatamente mayor es el 1: Hola,

Casi todo debería resultar fácil de entender, salvo quizá el símbolo ~. Esto se debe a que BinarySearch devuelve un número negativo cuando el texto que buscamos no aparece, pero ese número negativo tiene un significado: es el "valor complementario" de la posición del dato inmediatamente mayor (es decir, el dato cambiando los bits 0 por 1 y viceversa). En el ejemplo anterior, "posición" vale -2, lo que quiere decir que el dato no existe, y que el dato inmediatamente mayor está en la posición 1 (que es el "complemento a 2" del número -2, que es lo que indica la expresión "~posición"). En el apéndice 3 de este texto hablaremos de cómo se representan internamente los números enteros, tanto positivos como negativos, y entonces se verá con detalle en qué consiste el "complemento a 2".

A efectos prácticos, lo que nos interesa es que si quisiéramos insertar la frase "Hasta Luego", su posición correcta para que todo el ArrayList permaneciera ordenado sería la 1, que viene indicada por "~posicion".

Veremos los operadores a nivel de bits, como ~, en el tema 10, que estará dedicado a otras características avanzadas de C#.

8.4.2. SortedList

En un SortedList, los elementos están formados por una pareja: una clave y un valor (como en un diccionario: la palabra y su definición). Se puede añadir elementos con "Add", o acceder a los elementos mediante su índice numérico (con "GetKey") o mediante su clave (sabiendo en qué posición se encuentra una clave con "IndexOfKey"), como en este ejemplo:

/*---------------------------*/
/*  Ejemplo en C#            */
/*  sortedList1.cs           */
/*                           */
/*  Ejemplo de SortedList:   */
/*  Diccionario esp-ing      */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
using System.Collections;
public class ejemploSortedList  {
 
   public static void Main()  {
 
      // Creamos e insertamos datos
      SortedList miDiccio = new SortedList();
      miDiccio.Add("hola", "hello");
      miDiccio.Add("adiós", "good bye");
      miDiccio.Add("hasta luego", "see you later");
 
      // Mostramos los datos
      Console.WriteLine( "Cantidad de palabras en el diccionario: {0}",
        miDiccio.Count );
      Console.WriteLine( "Lista de palabras y su significado:" );
      for (int i=0; i<miDiccio.Count; i++)  {
         Console.WriteLine( "{0} = {1}", 
         miDiccio.GetKey(i), miDiccio.GetByIndex(i) );
      }
      Console.WriteLine( "Traducción de \"hola\": {0}",
        miDiccio.GetByIndex( miDiccio.IndexOfKey("hola") ));
   }
 
}
 

Su resultado sería


Cantidad de palabras en el diccionario: 3
Lista de palabras y su significado:
adiós = good bye
hasta luego = see you later
hola = hello
Traducción de "hola": hello

Otras posibilidades de la clase SortedList son: