====== Kolekcje i algorytmy (Generics) ====== ===== Collections ===== * [[http://msdn.microsoft.com/en-us/library/system.collections%28v=vs.110%29|System.Collections]] * [[http://msdn.microsoft.com/en-us/library/system.collections.arraylist%28v=vs.110%29.aspx|ArrayList]] * [[http://msdn.microsoft.com/en-us/library/system.array%28v=vs.110%29.aspx|Array]] - algorytmy do manipulacji tablicami * [[http://msdn.microsoft.com/en-us/library/system.collections.generic%28v=vs.110%29.aspx|System.Collections.Generic]], m.in.: * [[http://msdn.microsoft.com/en-us/library/6sh2ey19%28v=vs.110%29.aspx|List]] * [[http://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx|Dictionary]] * [[http://msdn.microsoft.com/en-us/library/f7fta44c%28v=vs.110%29.aspx|SortedDictionary]] * [[http://msdn.microsoft.com/pl-pl/library/9eekhta0%28v=vs.110%29.aspx|IEnumerable Interface]] ==== Przykład: Lista - losowanie Lotto ==== using System; using System.Collections.Generic; namespace Lotto { class Program { static void Main(string[] args) { List lista = new List(); for (int i = 1; i <= 49; i++) lista.Add(i); Console.WriteLine("Zawartośc kolekcji"); foreach (int i in lista) Console.Write("{0} ", i); Console.WriteLine("\n\nSize={0} Capacity={1}", lista.Count, lista.Capacity); Console.Write("Losowanie Lotto: "); Shuffle(lista); for (int i = 0; i < 6; i++) Console.Write("{0} ", lista[i]); Console.WriteLine(); lista.Sort(); } public static void Shuffle(List sequence) { Random random = new Random(); for (int i = 0; i < sequence.Count; i += 1) { int swapIndex = random.Next(sequence.Count); if (swapIndex != i) { T tmp = sequence[i]; sequence[i] = sequence[swapIndex]; sequence[swapIndex] = tmp; } } } } } ==== Przykład: Dictionary (słownik) ==== using System; using System.Collections.Generic; namespace Dictionary { class Program { static void Main(string[] args) { string line; SortedDictionary slownik = new SortedDictionary(); while ((line = Console.ReadLine()) != null) { if (!slownik.ContainsKey(line)) slownik.Add(line,1); else slownik[line]++; } foreach (KeyValuePair kvp in slownik) Console.WriteLine("{0} {1}", kvp.Key, kvp.Value); } } } ===== Zadanie - Gra RPG c.d. ===== Rozszerz program [[csharp_dziedziczenie#Gra_RPG|z poprzednich zajęć]] o nowe funkcjonalności opisane poniżej (solucja w VS2013 {{zajecia:po_2015_1:11_cs_gra_rpg:rpg.zip}}). \\ Dla klasy reprezentującej drużynę bohaterów: * dodaj indekser ''[]'' dający dostęp do ''i''-tego bohatera w drużynie, * zaimplementuj interfejs ''IClonable'', tak by możliwe było stworzenie kopii całej drużyny, * dodaj konstruktor przujmujący w argumencie kolekcję ''IEnumerable'', * zaimplementuj interfejs ''IEnumerable'', tak aby możliwe było iterowanie elementów drużyny za pomocą pętli ''foreach'', * zaimplementuj metodę ''Sortuj'', która posortuje bohaterów w kolekcji względem mocy ataku (sortownanie realizowane za pomocą obiektu implementującego interfejs ''IComparer''), * zaimplementuj metodę ''Transformuj'', która przyjmuje jako argument delegata, który jest w stanie wykonać dowolną operację na elementach drużyny (na obiektach implementujących ''IPostac''). Zaimplementuj delegata, który zmniejszy/zwiększy wartość punktów życia o pewną wartość dla każdego bohatera w drużynie, * dodaj obsługę wyjątków ''ArgumentNullException'' oraz ''ArgumentOutOfRangeException'' w wypadku podania niewłaściwych argumentów do metod klasy, * zaimplementuj metodę zapisującą zawartość drużyny do pliku (binarnie lub tekstowo) * zaimplementuj motodę zapisującą oraz odczytującą drużynę z pliku o podanej w argumencie nazwie za pomocą mechanizmu serializacji ===== Zadanie - Lista płac ===== Utwórz klasę reprezentującą listę płac w firmie. Do listy płac można dodać dowolną ilość pracowników, listę można wydrukować na ekranie, zapisać do pliku oraz posortować względem wysokości pensji. Wykorzystaj w tym celu klasy pochodzące z rozwiązania zadania [[csharp_dziedziczenie#Zadanie:_Firma|Firma z poprzednich zajęć]]. \\ Klasa udostępnia następujące operacje: * metodę pozwalającą dodać nowego pracownika do listy * przeciążoną metodę ''ToString()'' zwracająca tekst zawierający listę płac. W każdym wierszu tekstu znajduje się wpis dotyczący pojedynczego pracownika: numer porządkowy, imię, nazwisko oraz wysokość pensji. * metodę pozwalającą posortować listę względem wysokości pensji, od najwyższej do najniższej. \\ Kolejność ta powinna być widoczna po wywołaniu metody ''ToString()''. Sortowanie kolekcji wymaga utworzenie delegata realizującego porównanie [[http://msdn.microsoft.com/en-us/library/tfakywbh.aspx|Comparison]] lub obiektu implementującego interfejs [[http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx|IComparer]]. * konstruktor domyślny * konstruktor pozwalający zainicjować listę płac dowolną kolekcją (enumerowalną) zawierającą obiekty związane z pracownikami * metodę pozwalającą zapisać listę w postaci tekstowej do pliku o nazwie danej w argumencie metody * klasa reprezentująca listę płac implementuje interfejs ''IEnumerable'', pozwalając na iterowanie po kolejnych pracownikach umieszczonych na liście. ===== Zadanie - Figury na wykresie ===== Zaimplementuj klasę o nazwie ''Wykres'' realizującą dwuwymiarowy układ współrzędnych. Wykres przechowuje zbiór figur zaimplementowanych [[.:csharp_dziedziczenie|na poprzednich zajęciach]]. Klasa ta stanowi więc pojemnik do którego możemy dodać dowolną liczbę punktów, kół oraz trójkątów. Do przechowywania figur użyj wybranej kolekcji z przestrzeni nazw [[http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx|System.Collections.Generic]].\\ Dla obiektu reprezentującego wykres zaimplementuj: \\ * konstruktor domyślny * konstruktor przyjmujący jako argument tablicę figur * //[dla zaawansowanych]// konstruktor przyjmujący jako argument dowolną kolekcję figur * metodę ''Clone()'' tworzącą kopię obiektu (interfejs ''IClonable'') * metodę pozwalającą dodawać figury do wykresu * własność ''LiczbaFigur'' do odczytu liczby przechowywanych w kolekcji figur * zaimplementuj metodę dającą dostęp do elementu wykresu o podanym indeksie * //[dla zaawansowanych]// [[http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx|indekser]] dający dostęp do figury o podanym indeksie * dociąż metodę ''ToString()'' umieszczającą w łańcuchu znakowym informacje o wszystkich elementach umieszczonych na wykresie * W klasie reprezentującej wykres zaimplementuj metodę ''Sort()'', która posortuje kolekcję figur na wykresie w rosnącym porządku ze względu na wartość obwodu. \\ Kolejność ta powinna być widoczna po wywołaniu metody ''ToString()''. Sortowanie kolekcji wymaga utworzenie delegata realizującego porównanie [[http://msdn.microsoft.com/en-us/library/tfakywbh.aspx|Comparison]] lub obiektu implementującego interfejs [[http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx|IComparer]]. * Niech klasa reprezentująca wykres implementuje interfejs ''IEnumerable''.