Cele lekcji
Po zakończeniu tej lekcji…
- Dowiesz się, jak używać pętli Foreach z obiektami na listach.
Kolejna ważna operacja programistyczna, którą poznamy, dotyczy badania obiektów zawartych na listach. Może będziesz musieć zsumować wartości albo sprawdzić, czy na liście znajduje się wymagana liczba obiektów,
wtedy zastosujesz pętlę Foreach (dla każdego). Działanie tej pętli można opisać tak: Chcę zrobić coś dla każdego obiektu na liście.
Sprawdzanie obecności pozycji na liście za pomocą pętli Foreach
W klasie World znajduje się już kilka funkcji z pętlą Foreach.
Poniżej zamieszczam kod funkcji ItemByID() wyszukującej elementy na podstawie ich ID:
public static Item ItemByID(int id) { foreach(Item item in Items) { if(item.ID == id) { return item; } } return null; }
Listę Items utworzyliśmy jako zmienną na poziomie klasy. Wypełniliśmy ją też danymi z konstruktora. Dzięki tej funkcji możemy wyszukiwać elementy o takim samym ID, jakie podano w parametrze, i zwracać je do fragmentu programu, który wywołał tę funkcję.
Co się dzieje w nawiasach każdej pętli foreach?
Ciąg in Items na końcu oznacza listę, która zostanie przeszukana. W tym przypadku nazwą tej listy jest Items.
Pozycja Item w tym typie danych oznacza obiekty na liście,
a item to zmienna, która będzie zawierać wszystkie obiekty z listy, gdy kod w nawiasach klamrowych zostanie wykonany.
Więc ogólny wzór pętli foreach to:
foreach(TypDanych nazwaZmiennej w nazwieListy)
Po uruchomieniu kod pobiera pierwszy obiekt z listy Items i przypisuje go do zmiennej item,
a następnie sprawdza, czy właściwość ID bieżącej zmiennej item jest zgodna z id przekazanym funkcji jako parametr. Jeśli tak, to funkcja zwraca ten obiekt item. Jeśli nie, pętla foreach pobierze kolejny obiekt z listy, przypisze go do zmiennej item i wykona sprawdzenie.
Gdy funkcja sprawdzi wszystkie obiekty item liście Items i żaden z nich nie będzie zgodny, pętla foreach zostanie zakończona i uruchomiona zostanie pozostała część kodu w funkcji.
W takim wypadku tylko kod w pozostałej części funkcji zwraca wartość null.
UWAGA 1: Zwracanie wartości null ogólnie nie jest dobrym pomysłem, ponieważ kod wywołujący tę funkcję oczekuje informacji zwrotnych w postaci obiektu Item, a tym przypadku będzie musiał również mieć możliwość obsługiwania informacji zwrotnych null.
To właśnie jedna z tych rzeczy, które robimy w tym szkoleniu w zbyt prosty sposób, a których należy unikać w przypadku pisania „normalnych” programów.
UWAGA 2: W środowisku .Net dostępne jest rozwiązanie do obsługi list o nazwie LINQ. Pozwala ono na stosowanie takiej samej logiki, ale zawarcie jej w jednym wierszu kodu. Jednak niektórzy programiści potrzebują trochę czasu na zaznajomienie się z nim.
W poniższej funkcji pokazuję, jak pętlę foreach można zastąpić rozwiązaniem LINQ.
public void CalculateAverage() { // Create and populate the list of numbers List<double> values = new List<double>(); values.Add(1); values.Add(5); values.Add(21); // Calculating the average, using a foreach double total = 0; double counter = 0; foreach(double value in values) { total = (total + value); counter = (counter + 1); } double average = (total / counter); // Calculating the average, using LINQ double linqAverage = values.Average(); }
W kilku pierwszych wierszach wstawiłem kilka wyrażeń „double” (są to liczby o podwójnej precyzji, które mogą przyjmować wartości dziesiętne) i dodałem do nich wartości.
Następnie należy obliczyć średnią wartość każdej pętli „foreach”.
W tym celu potrzebne są zmienne zawierające łączną sumę wartości na liście oraz lista pozwalająca określić ilość elementów. Później musimy obliczyć średnią, dzieląc łączną sumę przez ilość wartości (w tym przykładzie nie przejmuję się tym, że lista jest pusta, ale normalnie spowodowałoby to wystąpienie błędu „dzielenia przez zero”).
Nasz kod zajmuje 10 wierszy w funkcji.
Ostatni wiersz pozwala uzyskać wartość średnią listy za pomocą funkcji LINQ. To tylko jeden wiersz.
Tak wygląda prosty przykład użycia funkcji LINQ. Oczywiście można ją skomplikować, ale to właśnie ze względu na jej złożoność nie omawiam jej w tym samouczku.
Podsumowanie
Wiesz już jak działają listy w naszej grze – przedmioty w plecaku, lista zadań, lokacji, przedmiotów, potworów w klasie World.