public Biblioteka(string adres_)
{ adres_ = adres; }
WTF? Czy Ty rozumiesz co robisz? Nie możesz użyć losowych zmiennych w losowej kolejności licząc na to, że uda się przypisać do pola klasy wartość argumentu konstruktora. Myśl co robisz. Nie myślisz - nie rób, wróć do problemu za pół godziny jak głowa odpocznie.
Debuguj samodzielnie swoje programy, aby znaleźć powód własnych błędów. Polecam nieco leciwy, ale w swoim meritum nadal aktualny artykuł Debugowanie.
public Pozycja znajdzPozycjepoId(int id)
{
foreach (Katalog katalog in katalogi)
{
if (katalog.pozycje.Exists(p => p.Id == id))
{
return katalog.pozycje.SingleOrDefault(p => p.Id == id);
}
}
return new Ksiazka();
}
WTF? Nie znaleziono, to zwracaj null albo wal wyjątkiem zamiast po cichu zwracać nieprawidłowy wynik. Wyobraź sobie użycie takiej wyszukiwarki: wpisujesz id (BTW skąd masz znać id wyszukiwanej ksiażki? Wyszukuje się zwykle po autorze i/lub tytule), wyskakuje Ci książka o pustych danych. Coś chyba nie tak, co?
Nazewnicto znowu fatalne. znajdźPozycjepoId
wyglada jakbyś nie mógl się zdecydować gdzie duża litera, a gdzie mała, więc rzucałeś monetą. ZnajdźPozycjęPoId
(tak tak, C# obsługuje UTF w nazwach elementów), ale i tak oczy bolą, bo powinno być GetPositionById
, albo - jeśli jesteś w klasie PositionService
- GetById
.
Do tego niespójne wcięcia. Piszesz w notatniku, czy w porządnym IDE (np. VS)? IDE by default na bieżąco formatuje to co piszesz, więc trzeba się naprawdę postarać, żeby spieprzyć formatowanie/wcięcia.
Koejna sprawa: jeśli katalog.pozycje.Exists zwróci true, ale masz dwie pozycje o tym samym id (mało możliwe, ale jednak), to dostaniesz wyjątek. Skoro Exists zwróciło true, to ani nie potrzebujesz Single (użyj First, które jest szybsze i nie zaskoczy Cię wyjątkiem), ani tym bardziej OrDefault, bo przecież sprawdziłeś linijkę wcześniej, że książka istnieje.
Całość da się zrobić prawidłowo w jednej linijce: public Position GetById(int id) => Catalogs.SelectMultiple(c => c.Positions).FirstOrDefault(p => p.Id == id);
.
public void dodajPozycje(Pozycja pozycja, string dzialTematyczny)
{
var katalog = katalogi.SingleOrDefault(k => k.DzialTematyczny == dzialTematyczny);
katalog.dodajPozycje(pozycja);
}
Jeśli dzialTematyczny
(brrr) nie istnieje, to dostaniesz null reference exception. Mam wrażenie, że nie rozumiesz, co robisz. SingleOrDefault
nazywa się tak jak się nazywa, bo zwraca null, jeśli nic nie znajdzie. A linijkę niżej radośnie odwołujesz się do zwróconej wartości. Tak się nie robi. Wyjątek ma być rzucony jak najbliżej miejsca, które spowodowało błąd, inaczej spędzisz wieki na szukaniu powodu tegoż wyjatku. Zatem var catalog = Catalogs.First(c => c.SectionTopic == sectionTopic);
albo var catalog = Catalogs.FirstOrDefault(c => c.SectionTopic == sectionTopic) ?? throw new ArgumentException($"Catalog with section topic {sectionTopic} not found");
. Warto się też zabezpieczyć przed ewentualnym dodaniem nulla do listy, bo potem - ponownie - będziesz dociekać dlaczego kod wywala się z NRE w kompletnie innym, pozornie niezwiązanym miejscu.
public void dodajKatalog(Katalog katalog)
{
katalogi.Add(katalog);
}
Zabezpiecz się przed null: public void AddCatalog(Catalog catalog) => catalogs.Add(catalog ?? throw new ArgumentNullException(nameof(catalog)));
.
I tak dalej, i tak dalej...