Lista part.2 – odczyt danych.

Lista part.2 – odczyt danych.

Podczas omawiania tablic napisaliśmy kod, który odczytuje pierwsze 7 miast z pliku CSV, ale co się stanie, jeśli chcemy odczytać wszystkie kraje z pliku CSV?

Czy możemy to zrobić?

Cóż, jest problem. Spójrz na kod w metodzie ReadFirstNCitys, która tworzy instancję tablicy do przechowywania miast. Tworząc tablicę, mówimy, jak duża będzie,
to znaczy, ile elementów będzie zawierać.

public City[] ReadFirstNCitys(int nCitys)
{
   City[] citys = new City[nCitys];
   ...
   return citys;
}

To dobrze, kiedy z góry zdecydowaliśmy, że chcemy odczytać 7 miast, ale jeśli chcemy odczytać wszystkie miasta, a kod odczytuje plik CSV wiersz po wierszu.

Wtedy nie będziemy wiedzieć, ile jest miast, dopóki kod nie osiągnie końca pliku i nie odkryje, że nie ma już więcej miast, ale to jest już za późno, aby utworzyć tablicę, ponieważ musimy umieścić miasta w tablicy, gdy każde z nich zostanie zaimportowane.

Dlatego w tej sytuacji musimy utworzyć instancję kolekcji, zanim dowiemy się, ile elementów będziemy w niej przechowywać.

Jak możemy to zrobić za pomocą tablicy?

Niestety, w przypadku tablic odpowiedź brzmi:
nie możemy i to jest podstawowa słabość tablic. Tablice mają stały rozmiar.

Musimy określić rozmiar tablicy, kiedy tworzymy tablicę, ile elementów zawiera ta tablica, a potem nigdy nie możemy zmienić tego rozmiaru.

To świetnie, jeśli jest to zbiór powiedzmy miesięcy w roku lub dni tygodnia,
kiedy dokładnie wiemy, ile elementów będziemy potrzebować, ale w większości przypadków, gdy czytamy dane z zewnętrznego źródła danych, nie wiemy, ile elementów będzie, dopóki nie skończymy czytać danych.

I tu pojawia się lista – List<T>

Lista jest bardzo podobna do tablicy, z tym wyjątkiem, że nie ma ustalonego rozmiaru. Możemy dowolnie dodawać do niej dowolną liczbę elementów, kiedy tylko chcemy.

Lista automatycznie rozszerza się i kurczy w zależności od zawartości.
Po utworzeniu obiektu listy możemy w łatwy sposób wstawiać elementy,
usuwać wybrane z dowolnego miejsca, podglądać ich zawartość,
a nawet przenosić z jednego miejsca w inne
.

Jeśli chcemy, aby lista stringów zawierała miesiące, deklarujemy zmienną jako Listę stringów.

List<string> months = new List<string>();

I będzie ona równa nowej liście stringów i zauważ, że nazwa typu, którego jest lista to string. Podobnie, gdybyśmy chcieli listę liczb całkowitych.

List<int> ints = new List<int>();

I innego typu listy.

List<double> chars = new List<double>();
List<char> chars = new List<char>();
List<Person> chars = new List<Person>();

Po prawej stronie znaku równości widać standardową składnię konstruktora C#. Konstruktor nie ma parametrów, ponieważ w przeciwieństwie do tablicy, lista zawsze zaczyna swoje życie jako pusta. Musimy dynamicznie dodawać do niej elementy po utworzeniu jej.

Nazwa typu listy ma oczywiście inną składnię niż tablice, w których można by zobaczyć coś w rodzaju nawiasów kwadratowych, ponieważ tablice są częścią środowiska wykonawczego .NET i dlatego mają swoją własną specjalną składnię w języku C#.

Z drugiej strony lista jest zwykłym typem, a zatem jest zgodna z normalną składnią C# przy tworzeniu nowych obiektów.

Zasadniczo listy są bardziej elastyczne niż tablice,
ale tablice zwykle dają ci prostszy kod,
więc jako ogólną zasadę użyj listy zamiast tablicy tylko wtedy,
gdy jest to sytuacja, w której nie możesz użyć tablicy.

Całościowe omówienie tematu kolekcji (tablica, lista, kolejka, stos, słownik).
Wiele przydatnych wskazówek i dobrych praktyk dostępne jest na kursie:

https://dev-hobby.pl/kursy/c-wprowadzenie-do-kolekcji/

2 comments

  1. Wow! In the end I got a website from where I be capable of in fact get valuable information concerning my study and knowledge. Mimi Reinold Lionel

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *