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

Korzystanie z Listy Skladnikow

0 głosów
63 wizyt
pytanie zadane 5 lutego w C# i .NET przez BLAZO Nowicjusz (180 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 przez NowyUrzydgownig Gaduła (3,610 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 przez MikDal Mądrala (5,160 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 przez BLAZO Nowicjusz (180 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 przez MikDal Mądrala (5,160 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 przez BLAZO Nowicjusz (180 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 przez MikDal Mądrala (5,160 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 przez gagyn Gaduła (4,720 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 przez MikDal Mądrala (5,160 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ź 70 wizyt
pytanie zadane 24 kwietnia 2018 w C# i .NET przez Robert Daraż Początkujący (370 p.)
0 głosów
1 odpowiedź 81 wizyt
0 głosów
2 odpowiedzi 114 wizyt
pytanie zadane 8 czerwca 2017 w C# i .NET przez liledusty Obywatel (1,430 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

62,369 zapytań

108,500 odpowiedzi

226,513 komentarzy

35,488 pasjonatów

Przeglądających: 317
Pasjonatów: 15 Gości: 302

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...