• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Korzystanie z Listy Skladnikow

VPS Starter Arubacloud
0 głosów
168 wizyt
pytanie zadane 5 lutego 2019 w C# przez BLAZO Nowicjusz (230 p.)

Witam.

Od razu zaznaczę ze w nazwach mogą występować błędy.

Mam problem z wyswietlaniem listy skladnikow.

Mam stworzoną listę Składników którą od razu inicjalizuje :

 

internal class Igredient
    {

        public  string Name { get; set; }
        public  List<Igredient> ListIgredient { get; set; } = new List<Igredient>();



        public void AddIdredient()
        {
           
            do
            {
                Console.WriteLine("Add Name of Idgredient");
                string nameOfIdgredient = Console.ReadLine();
                ListIgredient.Add(new Igredient { Name = nameOfIdgredient });


                Program.youWannacalc = StringOperation.ReadParameter("If you wanna add next idgredient enter YES");
            }
            while (Program.youWannacalc == "YES");
           
        }

      

        public void ShowList(IEnumerable<Igredient> giveListIgrediens)
        {
            Console.WriteLine("----------------------------------");
            Console.WriteLine("It is a list available ingredients");

            foreach (var item in giveListIgrediens)
            {
               
                Console.WriteLine(item.Name);
            }
        }
    

 

Następnie w metodzie main chciałbym dodać składniki do listy. Mam obecnie coś takiego :

case 1:
                    var idredients = new Igredient();
                    idredients.AddIdredient();
                    idredients.ShowList(idredients.ListIgredient);

Gdy przechodzę Enumerable po liscie to wszystko ladnie sie wyswietla, jednak mam kilka problemów:

1. Wychodząc z metody niestety lista mi zanika. Nie ma już jak sie do niej odwołać jeszcze raz.

2 Chiałbym np mieć możliwość ponownego wejscia w metodę która dodaje mi składniki i dodaje do tej samej listy składniki ( w tej chwili inicjalizowana jest niestety na nowo).

3. Chciałbym w innej klasie skorzystać z tej listy ale do końca nie wiem jak : Mam narazie stworzone taką klasę :

 class Pizza
    {
        private string Name { get; set; }
        private decimal Price { get; set; }

        public List<Pizza> Pizzas { get; set; } = new List<Pizza>();
        public List<Sauce> Sauces { get; set; }
        public List<Igredient> Igredients { get; set; }


        public void AddPizza()
        {
         

        }

        public void ShowAllPizzas(IEnumerable<Pizza> listPizzas)
        {
            Console.WriteLine("It is a list available pizzas");
            foreach (var item in listPizzas)
            {
                Console.WriteLine($"Sauce {item.Name} for {item.Price} ");

            }
        }

    }

 

Proszę o wytłumaczenie mi jak się to wszystko przypisuje.

Pozdrawiam

komentarz 5 lutego 2019 przez NowyUrzydgownig Mądrala (5,090 p.)
Możesz stworzyć statyczną listę, która będzie przechowywać wszystkie twoje składniki. Obecnie tworzysz obiekt, który zawiera listę składników. W przypadku, gdy go inicjalizujesz, to robisz to lokalnie, więc gdy wychodzisz w metody, gdzie to zrobiłeś, wszystkie obiekty są kasowane. Ewentualnie możesz wszystko serializować i zapisywać do pliku w przypadku, gdy obiekt jest kasowany.
komentarz 5 lutego 2019 przez MikDal Mądrala (5,660 p.)

@BLAZO, Ty chcesz wytłumaczenie a ja chcialbym kod, który będę mógł uruchomić u siebie. 1) w którym miejscu znika CI lista? 2) W którym miejscu dodanie składników do już istniejących resetuje listę? 3) chciałbyś skorzystać – w jaki sposób? Bo nie nigdzie próby użycia. :). Osobiście myślę, że za dużo pytań jak na jeden temat, abyś mógł uzyskać szeroką i kompleksową odpowiedź. Na początku proponowałbym się ograniczyć do pierwszych dwóch, a trzecie pewno rozwiąże się samo przy okazji.

P.S. Postaraj się, aby odpowiedź na moje pytania została zawarta w głównym pytaniu – to ułatwi zrozumienie osobom, które później wejdą w ten wątek :)..

komentarz 5 lutego 2019 przez BLAZO Nowicjusz (230 p.)

@MikaDal Inicjalizuje liste w metodzie w klasie Program a dokadniej

 

 private static void ChooseMenuOption(int option)
        {
            switch (option)
            {
                case 1:
                    var idredients = new Igredient();
                    idredients.AddIdredient();
                    idredients.ShowList(idredients.ListIgredient);
                    break;
               case 5:
                    break;
                case 6:
                    Quit();
                    break;
                default:
                    Console.WriteLine("There is no option with the given number.");
                    break;
            }
        }

Wiec po wyjsciu z metody przypisanie niestety znika ( Z metody Igredient). Chcialbym moc za kazdym razem dodawac cos do tej samej listy a pozniej uzyc jej w innej klasie. 

komentarz 5 lutego 2019 przez MikDal Mądrala (5,660 p.)

A prosiłem o to, aby była to edycja pytania :). Tam jest taki ładny przycisk edytuj...

To nie lista znika, to cały obiekt znika. Spójrz, powołałeś go w linijce 6 (var idredients = new Igredient();) i jego zakres życia jest TYLKO wewnątrz case 1. Zaraz po wyjściu z niego CAŁY obiekt idredients zostaje usunięty z pamięci. Jeśli chcesz, aby obiekt przetrwał zmień jego zakres życia na przynajmniej taki sam jak zakres funkcji.

EDIT: Dodanie ostatniego zdania

komentarz 5 lutego 2019 przez BLAZO Nowicjusz (230 p.)
Czy wedug ciebie lepsza bylaby klasa statyczna ?

Jak moglbym ustawic dlugosc zycia dluzszy niz ta metoda. Rozumiem o co chodzi ze obiekt znika z pamieci ale jak zrobic aby lista utworzona z tej metody trafila do pamieci na stale.

 

Ps : Niestety nie moge odpowiedziec na samym dole. Nie wiem dlaczego, ale nie mam takiej opcji. Jak wchodze w pytania innych uzytkownikow to jak najbardziej to jest widoczne.
komentarz 5 lutego 2019 przez MikDal Mądrala (5,660 p.)

Ale nie masz odpowiadać na samym dole, proszę tylko o edycję swojego pytania. Czy czytałeś ten artykuł: https://forum.pasja-informatyki.pl/tips?

Nie, klasa statyczna stanowczo nie. Klasy statyczne prawie zawsze przeradzają się w czyste zło. Nie widzę calego twojego kodu, więcn ie mogę dokładnie powiedzieć Ci gdzie masz to umieścić, ale pomoże Ci już chociaż zapis taki:

Igredient idredients = new Igredient();
private static void ChooseMenuOption(int option)
{
    switch (option)
    {
        case 1:
            idredients.AddIdredient();
            idredients.ShowList(idredients.ListIgredient);
            break;
        case 5:
            break;
        case 6:
            Quit();
            break;
        default:
            Console.WriteLine("There is no option with the given number.");
            break;
    }
}

 

1 odpowiedź

+3 głosów
odpowiedź 5 lutego 2019 przez gagyn Stary wyjadacz (11,050 p.)

Polecam Ci rozdzielić klasę Ingredient na zarządzającą oraz na sam "składnik", czyli: np. klasa IngredientItem, która zawierałaby nazwę składnika oraz inne właściwości jakie chcesz, aby miał każdy składnik. Drugą klasą mogłoby być IngredientList, które zarządza listą składników (dodawanie, usuwanie składników). Poza tym dopiero w tej klasie tworzysz listę składników.

1
komentarz 5 lutego 2019 przez MikDal Mądrala (5,660 p.)

Ogólnie, jeśli mogę dopisać się do odpowiedzi kolegi, polecam zapoznać się z wszystkimi zasadami z SOLID, a w szczególności właśnie z tą napomnianą przez @gagyn Zasadą Pojedynczej Odpowiedzialności (SRP) z, na przykład, stąd: http://devman.pl/pl/techniki/zasady-solid-1-zasada-pojedynczej-odpowiedzialnoscisingle-responsibility/

Podobne pytania

0 głosów
1 odpowiedź 188 wizyt
pytanie zadane 24 kwietnia 2018 w C# przez Robert Daraż Początkujący (370 p.)
0 głosów
1 odpowiedź 1,687 wizyt
pytanie zadane 16 kwietnia 2023 w C# przez Whyyy Nowicjusz (240 p.)
0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 1 stycznia 2023 w C# przez Mariusz1990 Nowicjusz (120 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...