Struktury i listy w Visual Studio C#. Część 2: Operacje na liście

Materiał nawiązuje do poprzedniej lekcjii jest rozbudową poprzedniego projektu. W tym temacie zostanie poruszony problem przeglądania listy element po elemencie, przejście do wybranego elementu listy, usunięcie wybranego elementu listy oraz usunięcie całej listy.

Cel: Napisz aplikację, która na utworzonej liście danych wykona przeglądanie elementów listy oraz usuwanie wybranego elementu listy jak i całej listy

operacje na liście danych c#

Krok1. Układ komponentów

Do projektu z poprzedniego tematu dodajemy elementy ułatwiające nawigację w liście danych

Proponowane rozmieszczenie kontrolek przedstawia poniższy rysunek

Proponowane rozmieszczenie kontrolek przedstawia poniższy rysunek

Krok 2. Modyfikujemy funkcję dodaj() z poprzedniego tematu

Modyfikacja funkcji dodaj() z poprzedniego tematu będzie zawierać wartość bieżącego indeksu listy.

Deklarujemy prywatną zmienną do przechowywania bieżącego indeksu

Wskazówka:


public partial class Form1 : Form
{
	private Dane d;
	private List<Dane> lista = new List<Dane>();
	private int idBiezacy = 0;

Modyfikujemy funkcję dodaj() do poniższej postaci

Wskazówka:


private void dodaj()
{
	czyscDana();
	d.nazwisko = textBox1.Text; 
	d.imie = textBox2.Text;
	d.klasa = textBox3.Text;
	lista.Add(d);
	idBiezacy = lista.Count - 1;
}

Krok 3. Piszemy funkcję ustawiającą przeglądanie danych na bieżący element listy

Podstawą działania przeglądania listy jest uniwersalna funkcja odczytująca dane dowolnego elementu listy- rekordu listy. Pamiętamy, że naszymi elementami są dane oparte na zdefiniowanej strukturze w poprzednim temacie.

Nasza funkcja odczytując dane z dowolnego indeksu będzie o dwóch argumentach. Pierwszym argumentem jest indeks elementu, drugim parametrem jest kontrolka typu TextBox (w kontrolce tej będzie pokazywany odczytany rekord danych)

Wskazówka:


private void pokazRekord(int id, TextBox tb)
{
	if (id < 0 || id>lista.Count-1) return;
	d = lista[id];
	tb.Clear();
	tb.AppendText((id+1).ToString() + Environment.NewLine);
	tb.AppendText(d.nazwisko + Environment.NewLine);
	tb.AppendText(d.imie + Environment.NewLine);
	tb.AppendText(d.klasa + Environment.NewLine);
}

Wywołanie powyższej funkcji zrealizujemy w zdarzeniu Click kontrolki Button

Wskazówka:


private void button3_Click(object sender, EventArgs e)
{
	pokazRekord(idBiezacy, textBox4);
}

Sprawdź efekt działania aplikacji (na tym etapie utworzonego kodu wynikiem jest zwsze ostatni dopisny rekord danych do listy)

bieżący rekord listy c#

Krok 4. Metoda ustawiająca przeglądanie listy na pierwszy element

Rozwiązanie tego problemu jest proste. Wystarczy przypisać bieżący indeks na wartość zero i wywołać naszą funkcję pokazRekor.

Wskazówka:


private void button4_Click(object sender, EventArgs e)
{
	//pokaz pierwszy rekord
	idBiezacy = 0;
	pokazRekord(idBiezacy, textBox4);
}

Sprawdź efekt działania aplikacji

przeglądanie listy na pierwszy element c#

Krok 5. Metoda ustawiająca przeglądanie listy na ostatni element

Ustawiamy bieżący indeks na ostatni element

Wskazówka:


private void button7_Click(object sender, EventArgs e)
{
	//pokaz ostatni rekord
	idBiezacy = lista.Count-1;
	pokazRekord(idBiezacy, textBox4);
}

Sprawdź efekt działania aplikacji

ostatni element listy c#

Krok 6. Przeglądanie listy w lewo

Przez przeglądanie listy w lewo, rozumie się przeglądanie elementów od bieżącej pozycji w stronę indeksów mniejszych. Metodę przeglądania musimy zabezpieczyć przed przekroczeniem wartości bieżącego indeksu poniżej zera.

Wskazówka:


private void button5_Click(object sender, EventArgs e)
{
	//pokaz kolejny rekord z lewej
	idBiezacy--;
	if (idBiezacy < 0) idBiezacy = 0;
	pokazRekord(idBiezacy, textBox4);
}

Sprawdź efekt działania aplikacji

przeglądanie listy w lewo c#

Krok 7. Przeglądanie listy w prawo

Przez przeglądanie listy w lewo, rozumie się przeglądanie elementów od bieżącej pozycji w stronę indeksów większych. Metodę przeglądania musimy zabezpieczyć przed przekroczeniem wartości bieżącego indeksu powyżej górnego zakresu.

Wskazówka:


private void button6_Click(object sender, EventArgs e)
{
	//pokaz kolejny rekord z prawej
	idBiezacy++;
	if (idBiezacy >lista.Count-1) idBiezacy = lista.Count - 1;
	pokazRekord(idBiezacy, textBox4);
}

Sprawdź efekt działania aplikacji

Krok 8. Przeglądanie dowolnego elementu listy

Przeglądanie dowolnego elementu listy możemy zrealizować w zdarzeniu zwolnienia klawisza edycyjnego w kontrolce TextBox. Zakładamy, że nie będziemy wprowadzać wartości innych niż z klawiszy numerycznych

Wskazówka:


private void textBox5_KeyUp(object sender, KeyEventArgs e)
{
	if (textBox5.Text.Length < 1)
	{
		idBiezacy = 0;
		textBox5.Text = "1";
	}
	else
	{
		idBiezacy = Convert.ToInt16(textBox5.Text) - 1;
	}
	pokazRekord(idBiezacy, textBox4);
}

Sprawdź efekt działania programu

bieżący element listy c#

Krok 9. Usunięcie bieżącego elementu z listy

Usuwanie bieżącego elemntu listy polega na wywołaniu funkcji RemoveRange z klasy List. Jest to funkcja dwuargumentowa. Pierwszym argumentem jest indeks elementu usuwanego, drugim jest ilość usuwanych elementów.

Wskazówka:


private void button10_Click(object sender, EventArgs e)
{
	lista.RemoveRange(idBiezacy, 1);
	toolStripStatusLabel1.Text = lista.Count.ToString();
}

Sprawdź efekt działania programu

Usunięcie bieżącego elementu z listy

Po usunięciu wybranego elementu można pokazać pełną zawartość listy. Usuniętego elementu nie powinno na liście być

Usuniętego elementu nie powinno na liście być

Krok 10. Usunięcie całej listy

Myślę, że kod nie wymaga wyjaśnień

Wskazówka:


private void button9_Click(object sender, EventArgs e)
{
	lista.Clear();
	toolStripStatusLabel1.Text = lista.Count.ToString();
}

Sprawdź efekt działania programu

wyczyść listę c#

Rozwiązanie pod konsolę

Tak samo działający kod ale dla konsoli

Wskazówka:


namespace struktura_listy_konsola_cz2
{
    struct Dane
    {
        public string nazwisko;
        public string imie;
        public string klasa;
    }
    internal class Program
    {
        static Dane d;
        static List<Dane> lista = new List<Dane>();
        static int idBiezacy = 0;

        static void czyscDana()
        {
            d.nazwisko = "";
            d.imie = "";
            d.klasa = "";
        }

        static void dodaj()
        {
            czyscDana();
            Console.WriteLine("nazwisko: ");
            d.nazwisko = Console.ReadLine();
            Console.WriteLine("imię: ");
            d.imie = Console.ReadLine();
            Console.WriteLine("klasa: ");
            d.klasa = Console.ReadLine();
            lista.Add(d);
            idBiezacy = lista.Count - 1;
        }

        static void pokazListe()
        {
            Console.WriteLine("nr\tnazwisko\timię\tklasa");
            for (int i = 0; i < lista.Count; i++)
            {
                Console.WriteLine((i + 1) + "\t"
                    + lista[i].nazwisko + "\t"
                    + lista[i].imie + "\t"
                    + lista[i].klasa);
            }
        }
        
        static void pokazRekord(int id)
        {
            if (id < 0 || id > lista.Count - 1) return;
            d = lista[id];
            Console.WriteLine("\n"+id+ "\t"
                                + d.nazwisko + "\t"
                                + d.imie + "\t"
                                + d.klasa);
        }

        static void pokazPierwszyRekord()
        {
            //pokaz pierwszy rekord
            idBiezacy = 0;
            pokazRekord(idBiezacy);
        }

        static void pokazOstatniRekord()
        {
            //pokaz ostatni rekord
            idBiezacy = lista.Count - 1;
            pokazRekord(idBiezacy);
        }

        static void pokazKolejnyLewy()
        {
            //pokaz kolejny rekord z lewej
            idBiezacy--;
            if (idBiezacy < 0) idBiezacy = 0;
            pokazRekord(idBiezacy);
        }

        static void pokazKolejnyPrawy()
        {
            //pokaz kolejny rekord z prawej
            idBiezacy++;
            if (idBiezacy > lista.Count - 1) idBiezacy = lista.Count - 1;
            pokazRekord(idBiezacy);
        }

        static void pokazWybrany()
        {
            Console.WriteLine("\nPodaj indeks: ");
            idBiezacy = int.Parse(Console.ReadLine());
            pokazRekord(idBiezacy);
        }

        static void usunBiezacy()
        {
            lista.RemoveRange(idBiezacy, 1);
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Witaj w CzD!");
            Console.WriteLine("Wybierz działanie\n" +
                            "+- dodaj dane\n" +
                            "p- pokaz listę\n" +
                            "r- pokaz biezacy\n" +
                            "a- pokaz pierwszy\n" +
                            "<- przeglądaj w lewo\n" +
                            ">- przeglądaj w prawo\n" +
                            "w- pokaz wybrany o indeksie\n" +
                            "u- usuń bieżący\n" +
                            "Esc- koniec");
            ConsoleKeyInfo klawiszInfo;
            do
            {
                klawiszInfo = Console.ReadKey();
                switch (klawiszInfo.KeyChar)
                {
                    case '+': dodaj(); break;
                    case 'p': pokazListe(); break;
                    case 'r': pokazRekord(idBiezacy); break;
                    case 'a': pokazPierwszyRekord(); break;
                    case 'z': pokazOstatniRekord(); break;
                    case '<': pokazKolejnyLewy(); break;
                    case '>': pokazKolejnyPrawy(); break;
                    case 'w': pokazWybrany(); break;
                    case 'u': usunBiezacy(); break;
                }
            } while (klawiszInfo.Key != ConsoleKey.Escape);
        }
    }
}

Wynik działania powyższego kodu pokazuje poniższa ilustracja

listy i struktury konsola, Visual Studio C#
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz