Kolekcje i algorytmy (Generics)

Przykład: Lista - losowanie Lotto

using System;
using System.Collections.Generic;
 
namespace Lotto
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> lista = new List<int>();
            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<int>(lista);
 
            for (int i = 0; i < 6; i++) Console.Write("{0} ", lista[i]);
            Console.WriteLine();
 
            lista.Sort();
        }
 
        public static void Shuffle<T>(List<T> 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<string, int> slownik = new SortedDictionary<string, int>();
 
            while ((line = Console.ReadLine()) != null)
            {
                if (!slownik.ContainsKey(line)) slownik.Add(line,1);
                else slownik[line]++;
            }
 
            foreach (KeyValuePair<string, int> kvp in slownik)
                Console.WriteLine("{0} {1}", kvp.Key, kvp.Value);
        }
    }
}

Rozszerz program z poprzednich zajęć o nowe funkcjonalności opisane poniżej (solucja w VS2013 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<IPostac>,
  • zaimplementuj interfejs IEnumerable<T>, 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

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 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 Comparison lub obiektu implementującego interfejs 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<T>, pozwalając na iterowanie po kolejnych pracownikach umieszczonych na liście.

Zaimplementuj klasę o nazwie Wykres realizującą dwuwymiarowy układ współrzędnych. Wykres przechowuje zbiór figur zaimplementowanych 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 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] 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 Comparison lub obiektu implementującego interfejs IComparer.
  • Niech klasa reprezentująca wykres implementuje interfejs IEnumerable<T>.