• 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,700 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
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

62,258 zapytań

108,384 odpowiedzi

226,222 komentarzy

34,772 pasjonatów

Przeglądających: 272
Pasjonatów: 16 Gości: 256

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.

...