Metoda, która dodaje obiekty do listy [C#]

0

Cześć, właśnie robię pewien projekt i mam z nim problem. Otóż utworzyłem, metodę, która dodaje do listy nowoutworzony obiekt. Niby wszystko super działa, lecz gdy już chcę dodać drugi obiekt, to nadpisuje on ten pierwszy obiekt. Czy ktoś wie jak rozwiązać ten problem? Jak powinna wyglądać ta metoda?

List<Samochody> listaSamochodow = new List<Samochody>();


        public void StworzSamochody()
        {
            listaSamochodow.Add(new Samochody());
        }

Tak to wygląda:
screenshot-20220607120335.png

2

Hej,

pierwsza sprawa to z kodu który wkleiłeś nie wynika że problem.
bo masz inicjalizowaną listę, a następnie do niej dodajesz nowy samochod za pomocą pustego konstruktora.

Czy możesz wrzucić metodę która ci wypisuje ten string BMW m5 numer pojazdu: 33, numer indeksu x
W jaki sposób ustawiasz właściwości dla pojazdu?

0
Kardash napisał(a):

Hej,

pierwsza sprawa to z kodu który wkleiłeś nie wynika że problem.
bo masz inicjalizowaną listę, a następnie do niej dodajesz nowy samochod za pomocą pustego konstruktora.

Czy możesz wrzucić metodę która ci wypisuje ten string BMW m5 numer pojazdu: 33, numer indeksu x
W jaki sposób ustawiasz właściwości dla pojazdu?

Wypisywanie elementów w liście:

 case 3: // wyświetlanie listy wszystkich dodanych samochodów
                        Console.WriteLine($"Liczba wszystkich samochodów: {listaSamochodow.Count}");
                        foreach (Samochody lista in listaSamochodow)
                        {
                            Console.WriteLine($"{marka.ToUpper()} {model.ToUpper()}, numer pojazdu: {numerPojazdu}, numer indeksu: {listaSamochodow.IndexOf(lista)}");
                        }
                        goto wyborOpcji;

Metoda, która ustawia właściwości dla pojazdu:

        public virtual void WprowadzDane()
        {
            SprawdzDane(ref marka, "Marka pojazdu: ");

            SprawdzDane(ref model, "Model pojazdu: ");

            SprawdzDane(ref numerPojazdu, "Numer pojazdu: ");
        }

W metodzie, która wprowadza dane do pojazdu, jest wywoływana metoda, która ma sprawdzić dane (np. czy ktoś do numeru pojazdu nie wpisał tekstu). Tutaj przykład dla numerPojazdu:

        public void SprawdzDane(ref uint dane, string napis)
        {
            bool powodzenie;
            do
            {
                powodzenie = false;

                try
                {
                    Console.Write(napis);
                    dane = uint.Parse(Console.ReadLine());
                }
                catch (Exception)
                {
                    WyswietlBlad("Błędne dane!");
                    powodzenie = true;
                }
            } while (powodzenie);
        }

Ogólnie to użytkownik ma wprowadzać dane dla pojazdu

2

we wprowadź dane dodaj nową linijkę na koniec która dodaje ci samochód do listy :)

ten kod mozna uproscic, na razie zrobiłem to tak - wydaje mi sie ze jest czytelniej
mozesz zrobić nowy konstruktor dla klasy Samochód i będziesz przez niego tworzył obiekt

    public virtual void WprowadzDane()
    {
        SprawdzDane(ref marka, "Marka pojazdu: ");

        SprawdzDane(ref model, "Model pojazdu: ");

        SprawdzDane(ref numerPojazdu, "Numer pojazdu: ");
        
        var nowySamochod = new Samochod();
        
        nowySamochod.marka = marka;
        
        nowySamochod.model = model;
        
        nowySamochod.numerPojazdu = numerPojazdu;
        
        listaSamochodow.Add(nowySamochod);
    }
2

jeden wielki chaos

catch (Exception)
                {
                    WyswietlBlad("Błędne dane!");
                    powodzenie = true;
                }

Przyznam się po wielu latach jestem podbudowany. Zawsze Exception było dla mnie niepowodzeniem, a tu tyle optymizmu. Dziękuję droga Tino.

                List<Samochody>

To co w tej liście naprawdę jest?

Jakieś ref uint, jakieś virtual ... Bosch ...

@kefirekk:
Zamieszczasz jakieś odpryski kodu, z których nic dobrego nie wynika. Printskriny które nie maja odniesienia do pełnego kodu, który je tworzy itd...
Z tego co widać, wklejasz przypadkowe ficzery języka, jakie zdarzyło cię się w googlu znaleźć.

Mam 95% przekonania, że nie panujesz.
Bez całości kodu to nawet trudno sobie odtworzyć "co poeta miał na myśli" - jak długo będziesz nas karmił ogryzkami, nie dostaniesz sensownej rady

0
ZrobieDobrze napisał(a):

jeden wielki chaos

catch (Exception)
                {
                    WyswietlBlad("Błędne dane!");
                    powodzenie = true;
                }

Przyznam się po wielu latach jestem podbudowany. Zawsze Exception było dla mnie niepowodzeniem, a tu tyle optymizmu. Dziękuję droga Tino.

zmienna powodzenie daje znać pętli do while, że już może się skończyć, ale no być może powinienem użyć innej nazwy zmiennej, np. niepowodzenie

                List<Samochody>

To co w tej liście naprawdę jest?

jest to lista, która zawiera obiekty klasy Samochody

Jakieś ref uint, jakieś virtual ... Bosch ...

virutal z tego z względu, iż metodę wirtualną można rozszerzać w klasach potomnych, dlatego jest to zastosowane

0
FlabbergastedPenguin napisał(a):

we wprowadź dane dodaj nową linijkę na koniec która dodaje ci samochód do listy :)

ten kod mozna uproscic, na razie zrobiłem to tak - wydaje mi sie ze jest czytelniej
mozesz zrobić nowy konstruktor dla klasy Samochód i będziesz przez niego tworzył obiekt

niestety obiekt nadal się nadpisuje

1

case 3: // wyświetlanie listy wszystkich dodanych samochodów
Console.WriteLine($"Liczba wszystkich samochodów: {listaSamochodow.Count}");
foreach (Samochody lista in listaSamochodow)
{
Console.WriteLine($"{marka.ToUpper()} {model.ToUpper()}, numer pojazdu: {numerPojazdu}, numer indeksu: {listaSamochodow.IndexOf(lista)}");
}
goto wyborOpcji;

Problem jest w wyświetlaniu listy pojazdów.

2

Królu złoty... Wywal coś takiego jak goto...
Jak już poprzednik zauważył.
Iterujesz po liscie samochodów
.net foreach (Samochody lista in listaSamochodow)
jednak wewnątrz foreach nie uzywasz obiektu z iteracji
Jak już to powinienś dać
.net Console.WriteLine($"{lista.marka.ToUpper()} {lista.model.ToUpper()}, numer pojazdu: {lista--numerPojazdu}, numer indeksu: {listaSamochodow.IndexOf(lista)}");

weź pod uwagę że w swoim foreach masz dostep do konkretnego samochodu wiec dla lepszej czytelnosci powinno byc

.net foreach(Samochody samochod in listaSamochodow)
Dodatkowo klasy powinny raczej wskazywać na l. pojedyńczą w tym wpadku

wiec klasa nie Samochody, a Samochod

PS. ucz się od poczatku nazwayć rzeczy po angielsku. nie samochód, a Car :D

            bool powodzenie;
            do
            {
                powodzenie = false;

                try
                {
                    Console.Write(napis);
                    dane = uint.Parse(Console.ReadLine());
                }
                catch (Exception)
                {
                    WyswietlBlad("Błędne dane!");
                    powodzenie = true;
                }
            } while (powodzenie);

To raczje powinno mieć formę

Console.Write(napis)
while(true)
{
 if(uint.TryParse(console.ReadLine(),out dane))
    break;
 WyswietlBlad("BledneDane");
}

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