Lista part.6 – wstawianie, wyszukiwanie …

Liczenie elementów.

Prawie każda kolekcja ma właściwość, która powie Ci, ile elementów jest w kolekcji,
ale dla prawie wszystkich kolekcji ta właściwość nazywa się Count. Natomiast Tablica jest dość dziwnym wyjątkiem, tablica różni się od wszystkich innych kolekcji gdyż ta właściwość nazywa się Length. Korzystając z listy aby wyświetlić listę miast napiszemy taki oto kod.

Console.WriteLine($"{citys.Count} citys");

Wstawianie elementu

Widziałeś, jak zbudować listę, dodając elementy. Dodanie naprawdę oznacza, że dodajesz elementy na końcu listy. Możemy zastanawiać się, czy możemy wstawiać element w środek listy a odpowiedź brzmi tak, możemy.

Lista zawiera metodę wstawiania Insert(), która działa trochę jak Add(), ale pozwala wstawiać element w dowolne miejsce na liście i możemy dodać miasto w środek listy.
Więc zaraz po zakończeniu odczytu miast z pliku chcemy powiedzmy wstawić nowe miasto.

Zdefiniuję więc zmienną reprezentującą nowe miasto.

City cityTest = new City("Test", "TES", "Polska",3000000, 1600000, 1400000);

Teraz musimy wstawić je do listy.

int index;
citys.Insert(index, cityTest);

Pierwszy parametr, pozwala określić indeks w którym chcesz wstawić nowy element. Program Visual Studio będzie wyświetlał błąd składniowy, ponieważ nie zainicjowaliśmy jeszcze indeksu, czyli miejsca w które chcę wstawić nowe miasto.

I to jest to następne zadanie.

Wyszukiwanie elementu.

Teraz mamy problem. Mam kod do wstawienia nowego miasta na listę, ale gdzie? Jaką wartość ustawić dla Indexu dla nowego miasta, na którą pozycje je wstawić?
Pomyślmy o tym.

Miasta są przechowywane na liście w kolejności malejącej populacji i mówimy, że populacja nowego miasta cityTest wynosi 3 miliony, więc oznacza to, że muszę znaleźć pierwsze miasto o populacji poniżej 3 milionów i wstawić nowe miasto tuż przed tym miastem.

Jak mogę to zrobić?

Istnieje metoda, która robi dokładnie to, czego potrzebujemy, FindIndex().
FindIndex() wyszuka od początku listy pierwszy element, który spełnia określone kryteria, a następnie zwraca indeks tego elementu.

int index = citys.FindIndex(city => city.TotalPopulation < 3000000);

Chcę powiedzieć, że index równa się citys.FindIndex.
Citys idzie do citys.TotalPopulation gdzie populacja wynosi mniej niż 3 miliony.
Powinienem wyjaśnić, co tutaj robimy, ponieważ jest to nieco zaawansowany C#.

FindIndex która przyjmuje jako parametr coś, co nazywa się predykatem. Predykat jest w zasadzie wyrażeniem zwracającym wartość logiczną (prawda lub fałsz), a po tym operatorze, który wygląda jak strzałka, jest w zasadzie wyrażenie, które zwraca prawde, jeśli miasto jest miastem o populacji mniejszej niż 3 miliony, i składnia tutaj reprezentuje tak zwane wyrażenie lambda.

Możesz myśleć o tym jako o szybkim sposobie pisania wyrażenia, które bierze cokolwiek po lewej stronie tej strzałki i zwraca to co jest po prawej stronie.

Sposób działania FindIndex polega na tym,
że będzie on uruchamiał to wyrażenie po kolei
na każdym elemencie listy, dopóki nie trafi na element,
dla którego wyrażenie jest prawdziwe.

Zakłada się, że jest to element, którego szukamy i zwraca indeks tego elementu i oczywiście podany przeze mnie predykat przetestuje miasto którego populacja jest mniejsza niż populacja nowego miasta ponieważ to powie nam, gdzie mamy wstawić nowe miasto na liście.

Dokładne wyjaśnienie 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/

oraz zachęcam do kursu typy generyczne gdzie pojawiają się wyrażenia lambda:

https://dev-hobby.pl/kursy/c-generics/

I gdy uruchomimy nasz kod. Mamy 17 miast, czyli o jedno więcej niż wcześniej, więc to dobrze. I nowe miasto znajduje się we właściwej pozycji między Malopolskim na nieco ponad 3 milionach a Dolnoslaskim na poziomie nieco poniżej 3 milionów.

Usuwanie elementu.

Możemy więc dodawać lub wstawiać elementy do listy. Co powiesz na usunięcie elementu?

Tak, to też możemy zrobić i to naprawdę dobrze, ponieważ musimy usunąć to nowe miasto z listy miast. Wpiszmy więc kod.

citys.RemoveAt(index);

Metoda RemoveAt() usuwa element o indeksie. Ten parametr jest indeksem elementu, który chcemy usunąć. Wiemy, że jest to poprawny indeks, ponieważ jest to indeks, o którym właśnie powiedzieliśmy aplikacji aby wstawiła nowe miasto.

Uruchommy teraz nasz kod. Wygląda dobrze, znów 16 miast, a nasze nowe miasto znikneło. W ten sposób usuwamy elementy z listy. Nawiasem mówiąc, zdaję sobie sprawę, że ten kod wygląda trochę bez sensu.

W rzeczywistości nigdy nie zamierzasz celowo wstawiać elementu a następnie natychmiast usuwać ten sam element ale w kontekście tego przykładu to najłatwiejszy sposób, aby pokazać ci, jak usunąć element.

Cały kod do kursu na githubie:

https://github.com/mariuszjurczenko/BeginningCsharpCollections/tree/be12896c36a6b3936e42bb3e76f9f6279b5b36f6

https://github.com/mariuszjurczenko/BeginningCsharpCollections

Dodaj komentarz

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