Dostęp do listy z innej metody

0

Dobry dzień!

Mój prosty program ma za zadanie obliczać proste matematyczne funkcje:

  1. Uruchom menuChoose() - opcje do wyboru:
Console.WriteLine("Dodaj: \n1. Odcinek \n2. Spaw \n3. Regenerator");
  1. Dodanie odcinka ma dodać do listy "section" element z długością. Dodanie spawu lub regeneratora po prostu zwiększa odpowiedni integer.
  2. Powrót do menu.
  3. W przyszłości podliczenie wszystkiego funkcją calculate()

Niestety nie wiem jak uzyskać dostęp wewnątrz switcha z metody menuChoose() do listy z metody DataBase oraz integerów z metody Main.

Za pomoc w objaśnieniu dziękuję!

Kod programu:


          public static void dataBase()
        {

                List<float> section = new List<float>();
        }




        public static void mainMenu()
        {
            Console.Clear();
            Console.WriteLine("Nadajnik->Złącze->\n");
            Console.WriteLine("Dodaj: \n1. Odcinek \n2. Spaw \n3. Regenerator");
            menuChoose();
        }


        public static void menuChoose()
        {

            var key = Console.ReadKey();
            switch (key.Key)
            {
                case ConsoleKey.D1:
                case ConsoleKey.NumPad1:

                    Console.Clear();
                    Console.WriteLine("Podaj długość odcinka:");
                    float result;
                    float.TryParse(Console.ReadLine(), out result);
                    
                    section.Add(result);
                    break;

                case ConsoleKey.D2:

                    WeldCount++;
                    break;

                case ConsoleKey.D3:
                    ConnectroCount++;
                    break;
                default:
                    Console.WriteLine("default");
                    break;
            }

        }


        static void Main(string[] args)
        {

            int WeldCount;
            int ConnectroCount;


            mainMenu();


        }

    }
}
 
0

Umieść listę w metodzie Main.
Po co metoda dataBase, która zawiera jedynie implementację listy?

1

Poczytaj o zasięgu zmiennych. Pokrótce zmienne są widoczne wewnątrz klamer w których zostały zadeklarowane. Oczywiście są wyjątki więc przeczytaj jeszcze raz moje pierwsze zdanie.

Min0s napisał(a):

Umieść listę w metodzie Main.

Przepraszam bardzo. Co mu to da?

0
UnlimitedPL napisał(a):

Poczytaj o zasięgu zmiennych. Pokrótce zmienne są widoczne wewnątrz klamer w których zostały zadeklarowane. Oczywiście są wyjątki więc przeczytaj jeszcze raz moje pierwsze zdanie.

Min0s napisał(a):

Umieść listę w metodzie Main.

Przepraszam bardzo. Co mu to da?

Dodałem public i nadal licho. Integery public bezpośrednio w klasie i nic.

1

Wróć jeszcze raz do zapoznania się z tematem. Samymi modyfikatorami dostępu tutaj nic nie zdziałasz. Zadeklaruj swoje zmienne poza metodami.

0
UnlimitedPL napisał(a):

Wróć jeszcze raz do zapoznania się z tematem. Samymi modyfikatorami dostępu tutaj nic nie zdziałasz. Zadeklaruj swoje zmienne poza metodami.

Zadeklarowałem je bezpośrednio w klasie.

   public class Program
    {

       public int WeldCount;
       public int ConnectroCount;
}
 

I w tej klasie mam metodę ze switchem, który nie może na nich operować.

0

Jak widać jeszcze brak Ci wiedzy na temat słowa kluczowego jakim jest static. Widać używasz ale nie wiesz po co on tam jest ani co on robi.

0
UnlimitedPL napisał(a):

Jak widać jeszcze brak Ci wiedzy na temat słowa kluczowego jakim jest static. Widać używasz ale nie wiesz po co on tam jest ani co on robi.

Dziękuję za poświęcony czas, myślę że chodzi o:

Natomiast jeśli chcemy tworzyć metody, które nie operują na strukturach klasy powinniśmy posłużyć się metodami statycznymi.

Teraz mój kod wygląda tak:

  public int WeldCount;
        public int ConnectroCount;
        public List<float> section = new List<float>();


        public void showResults()
        {
            float allSections = 0;
            foreach (float item in section)
            {
                allSections += item;
            }


            Console.WriteLine("Ilość spawów: {0}, ilość złączy: {1}, łączna długość trasy: {2}", WeldCount,ConnectroCount,allSections);
        }




        public static void mainMenu()
        {
            Console.Clear();
            Console.WriteLine("Nadajnik->Złącze->\n");
            Console.WriteLine("Dodaj: \n1. Odcinek \n2. Spaw \n3. Regenerator\n4. Show results");
            
            Program cipsko = new Program();
            cipsko.menuChoose();

            
        }


        public void menuChoose()
        {

            var key = Console.ReadKey();
            
            switch (key.Key)
            {
                case ConsoleKey.D1:
                case ConsoleKey.NumPad1:

                    Console.Clear();
                    Console.WriteLine("Podaj długość odcinka:");
                    float result;
                    float.TryParse(Console.ReadLine(), out result);

                    Program database = new Program();
                    section.Add(result);
                    mainMenu();
                    break;

                case ConsoleKey.D2:

                    WeldCount++;
                    mainMenu();
                    break;

                case ConsoleKey.D3:
                    ConnectroCount++;
                    mainMenu();
                    break;

                case ConsoleKey.D4:
                    showResults();
                    mainMenu();
                    break;





                default:
                    Console.WriteLine("Coś ty odjebał");
                    break;
            }

        }


        static void Main(string[] args)
        {

           

            mainMenu();



        }

Aczkolwiek metoda showResults, która powinna wyświetlić na ekranie wyniki zawsze podaje 0. Czy to oznacza, że w switchu dodanie do Listy ją zeruje pod koniec?

1
Program cipsko = new Program();
            cipsko.menuChoose();

Ekhm, mistrzu nazewnictwa... Za każdym razem, gdy wyświetlasz menu, tworzysz nowy obiekt, który ma na wstępie pustą kolekcję, i na nim następnie wywołujesz to menu ze switchem. Powinieneś operować cały czas na tym samym obiekcie Program, żeby dane nie ginęły.

0
ness napisał(a):
Program cipsko = new Program();
            cipsko.menuChoose();

Ekhm, mistrzu nazewnictwa... Za każdym razem, gdy wyświetlasz menu, tworzysz nowy obiekt, który ma na wstępie pustą kolekcję, i na nim następnie wywołujesz to menu ze switchem. Powinieneś operować cały czas na tym samym obiekcie Program, żeby dane nie ginęły.

Aktualnie program wygląda tak i na razie wykonuje swoje zdanie:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SpieprzajDziadu
{
   public class Program
    {

        public int WeldCount;
        public int ConnectroCount;
        public List<float> section = new List<float>();

        public Program()
        {
            section.Add(0);
        }
        public void showResults()
        {
            float allSections = 0;
            foreach (float item in section)
            {
                allSections += item;
            }

            Console.Clear();
            Console.WriteLine("Ilość spawów: {0}, ilość złączy: {1}, łączna długość trasy: {2}", WeldCount,ConnectroCount,allSections);
            Console.ReadKey();
        }




        public static void mainMenu()
        {
            Console.Clear();
            Console.WriteLine("Nadajnik->Złącze->\n");
            Console.WriteLine("Dodaj: \n1. Odcinek \n2. Spaw \n3. Regenerator\n4. Show results");



            
        }


        public void menuChoose()
        {

            var key = Console.ReadKey();
            
            switch (key.Key)
            {
                case ConsoleKey.D1:
                case ConsoleKey.NumPad1:

                    Console.Clear();
                    Console.WriteLine("Podaj długość odcinka:");
                    float result;
                    float.TryParse(Console.ReadLine(), out result);

                    
                    section.Add(result);
                    mainMenu();
                    menuChoose();

                    break;

                case ConsoleKey.D2:

                    WeldCount++;
                    mainMenu();
                    menuChoose();
                    break;

                case ConsoleKey.D3:
                    ConnectroCount++;
                    mainMenu();
                    menuChoose();
                    break;

                case ConsoleKey.D4:
                    showResults();
                    mainMenu();
                    menuChoose();
                    break;





                default:
                    Console.WriteLine("Coś ty odjebał");
                    break;
            }

        }


        static void Main(string[] args)
        {


            Program program = new Program();
            mainMenu();
            program.menuChoose();
            



        }





    }
}

Pytanie o złe praktyki, są jakieś rzucające się w oczy?
Drugie pytanie czy jest lepszy powrót do menu wybory niż w każdym przypadku dodać na końcu odwołanie do metody ,,menuChoose();"?

Dziękuję i pozdrawiam

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