Slownik z klasa jako wartosc, ktora posiada inny slownik.

0

Mam problem, otoz mam klase:

   class GradeSheet
   {
        static Dictionary<string, int> Grades = new Dictionary<string, int>()
    }

(plus ma jeszcze jakies metody ale oszczedze miejsca)
Klasa ta to dzienniczek w ktorym string to nazwa przedmiotu a int to ocena.
Mam jeszcze klase:

    class Group
    {
        static Dictionary<string, GradeSheet> Students = new Dictionary<string, GradeSheet>();
    }

I chcialbym zeby klasa Group mogla jako string miec studentow, i zeby kazdy z nich mial oceny z GradeSheet (ze slownika Grades).
Czy da sie to zrobic mniej wiecej w ten sposob?
Wszelka pomoc jest doceniana, bo glowkuje nad tym pare godzin i nie moge wymyslec.

2

Rozwiązanie powinno wyglądać mniej więcej tak:

public class SubjectGrades
{
    public string Name { get; set; }

    public int Grade { get; set; }
}

public class StudentGradeSheet
{
    public string StudentGuid { get; set; }

    public IList<SubjectGrades> SubjectGrades { get; set; }
}

public class Group
{
    public IList<StudentGradeSheet> StudentGradeSheets { get; set; }

    public IDictionary<string, IEnumerable<int>> StudentGradesDictionary =>
        StudentGradeSheets.ToDictionary(sgs => sgs.StudentGuid,
            sgs => sgs.SubjectGrades.Select(sg => sg.Grade));
}

Moje uwagi + opis tego, co wyżej wyklułem:

  1. Czy dostałeś polecenie, że słownik z klasy ma być statyczny? Wnioskuję, że nie. W Twoim takim wypadku utworzy się tylko jego jedna instancja niezależnie od tego, ile tych klas byś utworzył. Co z tego wynika? Będziesz mógł mieć wyłącznie jednego globalnego studenta z jego ocenami i nic ponadto. Zrezygnuj ze static, do tego zmień klasę na publiczną, skoro chcesz jej używać w innym miejscu jak w Twoim przykładzie,.
  2. Za dużo słowników - stworzyłeś jeden, do tego statyczny, następnie z tego jednego próbujesz "wykluć" następny. Wykorzystuj w tym celu klasy, żeby ułatwić czytelność tego, co tworzysz. Zerknij na przykład wyżej. Mamy klasę SubjectGrades, która jasno składa się z nazwy przedmiotu i oceny za niego. Następnie deklarujemy klasę StudentGradeSheet, która z kolei posiada guid studenta oraz jego oceny w formie listy. Czy nie wygląda to jaśniej niż słownik z przedmiotem i oceną, w dodatku nie wiadomo dla jakiego studenta?
  3. W końcu mamy klasę dla grupy, która (a znowuż!) składa się z listy studentów.
  4. Jeśli koniecznie chcesz utworzyć słownik, który będzie wiązał guid studenta i jego oceny (jak zrozumiałem bez nazw przedmiotów), wystarczy, że wykorzystasz wspomnianą listę StudentGradeSheets i za pomocą LINQ użyjesz metody ToDictionary, gdzie w jej środku pierwsza metoda z użyciem wyrażenia lambdy pozwala wybrać klucz, a druga, też z użyciem lambdy, jego wartość. Jeśli chcesz mieć słownik z guidem studenta i jego ocenami wraz z nazwą przedmiotu, wystarczy, że zrezygnujesz z Selecta.
  5. Zauważ, że property (właściwość) naszego słownika nie ma dopisanego settera. Co za tym idzie, do manipulowania wartościami wykorzystujemy listy (musisz dopisać odpowiednie metody, które będą dodawały oceny/studentów itd.), natomiast wartość dla naszego słownika tylko można pobrać, ale bez zmiany jej zawartości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1