csharp.aspone.cz csharp.aspone.cz

Práce se seznamem, úvod do kolekcí

Co se zde dozvíte? No co je to přeci seznam. Jak si představit takový seznam je těžší. Seznam je kolekce něčeho. Kolekce je vlastně nějaká množina stejných objektů. Na začátek vám převedu kolekci typů string, respketive seznam typů string.

Pro seznam musíte použít jmenný prostor System.Collections.Generic; Seznam tvořím takto.: List<typObjektu> jmenoSeznamu = new List<typObjektu>(); Jdem rovnou na věc. Udělám seznam, vytvořím něco co bude mít stejné typy. Seznam typu string a jméno mu dám podle položek, které v něm budu uchovávat. Vytvořím seznam filmů.
List<string> seznamFilmu = new List<string>();
Abych mohl do seznamu přidávat nějaká položky, musím použít metodu add, takže jsem do seznamu vložil 6 hodnot, které odpovídají 6ti filmům. No jo hezké, ale co se seznamem dál? No když ho mám nějak tak hotový, můžu si ho zkusit vypsat. Vypíši jej pomocí cyklu foreach. Prvky seznamu mohu také ze seznamu odebírat, k tomu slouží metod remove, dole je opět příklad, takže na seznam aplikuji remove a odeberu prvek typu string. Dále použiji k výpisu cyklus for. Foreach není vhodné používat, pokud chcete prvky porovnávat a za běhu cyklu třeba nějaký přidávat, či odebírat. S cyklem for již toto jde. Pomocí for k prvkům seznamu přistupuji pomocí indexů. Jo jako podmínku pro cyklus for jsem určil dokud není i menší než počet prvků v seznamu. Počet prvků seznamu jsem zjistil pomocí vlastnosti Count. Pokud chci seznam celý vymazat, použiji metodu Clear.

Pokud bych chtěl položky v seznamu měnit, nemůžu již pomocí foreach, ale musím přistoupit k iteraci a to pomocí for. Každý prvek seznamu pak mohu měnit přes jeho index Poslední pokus o výpis nic nevypíše, jelikož je seznam již prázdný.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            List seznamFilmu = new List();

            seznamFilmu.Add("Podfu(c)k");
            seznamFilmu.Add("Návštěvníci");
            seznamFilmu.Add("Equilibrium");
            seznamFilmu.Add("Hulk");
            seznamFilmu.Add("Dejavu");
            seznamFilmu.Add("Armagedon");

            foreach (string film in seznamFilmu)
                Console.WriteLine(film);

            Console.WriteLine();
            Console.WriteLine();

            seznamFilmu.Remove("Hulk");

            for (int i = 0; i < seznamFilmu.Count; i++)
            {
                Console.WriteLine(seznamFilmu[i]);
            }
            seznamFilmu.Clear();

            for (int i = 0; i < seznamFilmu.Count; i++)
                Console.WriteLine(seznamFilmu[i]);
        }
    }
}

Většinou seznam bývá kolekce nějaké třídy, to předvedu nyní. Dejme tomu bych měl třídu Člověk a zní vytvářel instance a každá by měla určité vlastnsti, třeba každý člověk má jméno, příjméní, váhu, pohlaví, barvu pleti, atd. Mám tedy seznam a v něm naházené tyto instance třídy člověk. Demonstruji na příkladě, akorát s městy. Zde jsem spáchal třídu město s konstruktorem jméno, pocet obyvatel, rozlohou, statutem a zkratkou. Třída přepisuje virtuální metodu ToString na lepší :D.

Další třídou je již třída seznam, ale v té je již zmiňovaný seznam (jména tříd se píší velkými písmeny, ne jako zde jo).

No a zde jsem vytvořil seznam objektů měst. Do seznamu přidávám položky metodou add. Jednoduše jméno seznamu.Add(objekt);

V metodě main jsem již vytvořil několik instancí třídy město a ty nacpal do seznamu. Následně jsem je vypsal. Pozor seznam jednoduše projdu pomocí cyklu foreach. Foreach a v něm typ ojektu a že je v něčem - tedy jméno seznamu. foreach(typObjektu názevProCyklus in názevSeznamu).

using System;
using System.Collections.Generic;


class Mesto
{
    private string jmeno;
    private long pocetObyvatel;
    private long rozloha;
    private byte statut;
    private zkratka zkratka;



    public Mesto(string jmeno, long pocetObyvatel, long rozloha, byte statut, zkratka zkratka)
    {
        this.jmeno = jmeno;
        this.pocetObyvatel = pocetObyvatel;
        this.rozloha = rozloha;
        this.statut = statut;
        this.zkratka = zkratka;
    }

    public override string ToString()
    {
        return string.Format("{0} ma pocet obyvatel {1},\nrozlohu {2},\nje mestem {3},
        \nzkracujem na {4}", jmeno, pocetObyvatel, rozloha, 
        ((statut == 0) ? "normálním" : "statutárním"), zkratka);
    }
 
}

class seznam
{
    private int pocitadlo = 0;

    private List<Mesto> mesto = new List<Mesto>();
    

    public void pridejMesto(Mesto mestecko)
    {
        mesto.Add(mestecko);
    }

    public void vypis()
    {
        foreach (Mesto m in mesto)
        {
           if (pocitadlo == 0)
            {
                System.Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine(m);
                pocitadlo++;
            }
            else
            {
                System.Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine(m);
                pocitadlo *= 0;
                System.Console.ForegroundColor = ConsoleColor.Green;
            }
            Console.Write("\n");  
        }
    }

}

class zkratka
{ 
    private string zkracene;

    public zkratka(string zkratka)
    {
        zkracene = zkratka;  
    }

    public override string ToString()
    {
        return string.Format("{0}", zkracene);
    }
}

class hlavni
{

    static void Main()
    {
        // tj. jen konstruktor třídy seznam  
        seznam sez = new seznam();


        sez.pridejMesto(new Mesto("Teplice", 60000, 12000, 0, new zkratka("TP")));
        sez.pridejMesto(new Mesto("Usti nad Labem", 100000, 20000, 1, new zkratka("UL")));
        sez.pridejMesto(new Mesto("Decin", 8000, 140000, 0, new zkratka("DC")));
        sez.pridejMesto(new Mesto("Praha", 1000000, 500000, 1, new zkratka("PH")));

        sez.vypis();
    }
}