Inicio
Semana 4 · Multilistas
Lista dentro de objeto

Multilista 1 a muchos — Album y Heroes

List<Album> albumes Album A001 — "Marvel" Heroes: List<Heroe> Hulk · 95 Thor · 98 Heroes.Count = 2 Album A002 — "DC" Heroes: List<Heroe> Batman · 80 Superman · 99 Heroes.Count = 2 Patron de acceso: var alb = albumes.Find(a => a.Codigo == "A001"); if (alb != null) foreach (var h in alb.Heroes) ... albumes.OrderByDescending(a => a.Heroes.Count).First()
📚 Una multilista 1 a muchos es como una carpeta de albumes de fotos: cada album es un objeto, y dentro de cada album hay una lista de fotos. Para listar las fotos primero buscas el album, luego recorres su lista interna.

Una multilista es una List<T> donde cada elemento T contiene a su vez otra List<...>. Es la forma natural de modelar relaciones 1 a muchos: un album tiene muchos heroes, una caja tiene muchas compras.

Estructura

class Heroe { string Codigo; string Nombre; int Poder; }
class Album {
    string Codigo;
    string Nombre;
    List<Heroe> Heroes;   // ← lista anidada
}
List<Album> albumes;       // ← lista de albumes

Operaciones tipicas

  • Crear album — validar que el codigo no exista ya en la lista.
  • Registrar heroe en un album — buscar el album, validar que el heroe no este repetido en ese album, agregarlo.
  • Listar heroes de un album — recorrer la lista anidada de ese album.
  • Album con mas heroes — comparar album.Heroes.Count entre todos.

Validaciones clave

En multilistas la regla mas importante es: no permitir duplicados. Antes de agregar, busca con Find o Any; si existe, no agregues.

🪟 Windows Forms — equivalente

En la clase esto se implementa en un Form. Las listas viven como atributos de la clase Form (no en Main):

public partial class FrmAlbum : Form {
    List<Album> albumes = new List<Album>();

    void btnCrearAlbum_Click(object sender, EventArgs e) {
        if (albumes.Any(a => a.Codigo == txtCodigo.Text)) {
            MessageBox.Show("Codigo repetido");
            return;
        }
        albumes.Add(new Album(txtCodigo.Text, txtNombre.Text));
        cboAlbumes.Items.Add(txtCodigo.Text);  // refrescar combo
    }

    void btnListarHeroes_Click(object sender, EventArgs e) {
        var alb = albumes.Find(a => a.Codigo == cboAlbumes.Text);
        lstHeroes.Items.Clear();
        foreach (var h in alb.Heroes)
            lstHeroes.Items.Add(h.Nombre + " (poder " + h.Poder + ")");
    }
}

Patron: el ComboBox elige el album, el ListBox muestra la lista anidada de ese album. La lista vive como atributo del Form para que persista entre clicks.

Program.cs
CONSOLA
Presiona "Ejecutar" para ver el output aqui...