Iterowanie elementów listy <T>

Iterowanie elementów listy <T>
23
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Witam,
mam problem z iterowaniem elementów listy. Pewnie dla większości będzie trywialne rozwiązanie.
Poniżej prosty kod z przykładu. Rezultatem działania ma być zmiana wartości z false na true w momencie znalezienia marki samochodu.

Kopiuj
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;

namespace WypozyczalniaSamochodow;

internal class Program
{
    public class Samochod
    {
        private string marka { get; set; }
        private string model { get; set; }
        private int rokProdukcji { get; set; }
        private bool czyDostepny { get; set; }

        public Samochod(string ma, string mo, int rp, bool czyDost)
        {
            marka = ma;
            model = mo;
            rokProdukcji = rp;
            czyDostepny = czyDost;
            DodajSamochod();
        }

        List<Samochod> samochody = new List<Samochod>();

        public void DodajSamochod()
        {
            samochody.Add(this);
            WyswietlInformacje();
        }

        public void ZmienDostepnosc(string szukanaMarka)
        {
            foreach (Samochod s in samochody)
            {
                if (s.marka == szukanaMarka)
                {
                    s.czyDostepny = true;
                }

            }
            WyswietlInformacje();
        }



        public void WyswietlInformacje()
        {
            foreach (Samochod s in samochody)
            {
                Console.WriteLine($"{s.marka}\t\t\t{s.model}\t\t{s.rokProdukcji}\t\t\t{s.czyDostepny}");
            }
        }
    }

    public static void Main()
    {
        Samochod sam1 = new Samochod("Toyota", "Yaris", 2000, false);
        Samochod sam1 = new Samochod("Mercedes", "CLK", 2001, true);
        Samochod sam4 = new Samochod("Audi", "R80", 1999, false);
        Samochod sam5 = new Samochod("Lamborgini", "Diablo", 2020, true);

        sam1.ZmienDostepnosc("Toyota");
        sam3.ZmienDostepnosc("Toyota");
        sam4.ZmienDostepnosc("Toyota");
        sam5.ZmienDostepnosc("Toyota");
    }
  }

Nie wiem jak iterować listę samochody aby nie trzeba było używać ciągle nowego obiektu (sam1, sam2 ...)ale jednocześnie aby działała metoda ZmienDostepnosc.

Z góry dziękuję za podpowiedzi.
Pozdrawiam

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
1

Po pierwsze - potrzebujesz funkcji, która ci zwróci wszystkie samochody, bo twoje List<Samochod> jest prywatne:

Kopiuj
public List<Samochod> GetSamochody()
{
  return samochody;
}

Po drugie - jest coś takiego jak Linq i nie trzeba w pętli lecieć po milionie samochodów żeby zmienić dostępność:

Kopiuj
    public void ZmienDostepnosc(string szukanaMarka)
    {
        Samochod s = samochody.FirstOrDefault(x=>x.marka == szukanaMarka);

        if(s != null)
        {
          s.CzyDostepny = true
        }

        WyswietlInformacje();

    }

A po trzecie - zmień dostępność jest w klasie samochód, więc czemu masz lecieć w pętli skoro możesz zrobić

Kopiuj
    public void ZmienDostepnosc()
    {
        this.CzyDostepny = true; // ten "this" nie jest wymagany, to tylko dla ciebie żebyś wiedział skąd to

        WyswietlInformacje();
    }

Wtedy zmieniasz dostępność tak:

Kopiuj
Samochod sam1 = new Samochod("Toyota", "Yaris", 2000, false);
sam1.ZmienDostepnosc();

Bez obrazy, ale trochę głupi ten kod jest. To jakieś zaliczenie, zadanie, co to niby ma być?

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

Nie wiem nawet od czego zacząć, ta klasa nie ma żadnego sensu i najlepiej ją zaorać. Powiedz co chcesz osiągnąć.
Teraz masz klasę z prywatnymi propertiesami (bez sensu, równie dobrze mogłyby to być fieldy), których się nie da zmieniać z zewnątrz. Każda instancja klasy Samochod trzyma kolekcję samochodów ale jest w niej zawsze tylko jeden element, da się dodać jedynie więcej takich samych samochodów do listy. Metoda "ZmienDostepnosc" nie powinna nic wyświetlać. Zupełnie bez sensu.

Przykładowo to może wyglądać tak:

Kopiuj
var samochody = new Samochody();
samochody.DodajSamochod(new("Toyota", "Yaris", 2000));
samochody.DodajSamochod(new("Mercedes", "CLK", 2001));
samochody.DodajSamochod(new("Audi", "R80", 1999));
samochody.DodajSamochod(new("Lamborgini", "Diablo", 2020));

samochody.ZmienDostepnosc("Toyota");
samochody.WyswietlInformacje();

public record class Samochod(string marka, string model, int rokProdukcji)
{
    public bool czyDostepny { get; set; }
}

public class Samochody
{
    List<Samochod> samochody = [];

    public void DodajSamochod(Samochod samochod)
    {
        samochody.Add(samochod);
    }

    public void ZmienDostepnosc(string szukanaMarka)
    {
        foreach (Samochod s in samochody)
        {
            if (s.marka == szukanaMarka)
            {
                s.czyDostepny = true;
            }
        }
    }

    public void WyswietlInformacje()
    {
        foreach (Samochod s in samochody)
        {
            Console.WriteLine($"{s.marka}\t\t\t{s.model}\t\t{s.rokProdukcji}\t\t\t{s.czyDostepny}");
        }
    }
}
23
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 9
0

Finalna wersja (pozwala na wyszukanie samochodu po indeksie lub marce, i daje możliwość zmiany silnika). Oczywiście praktycy pewnie zrobiliby mniej kodu a efekt byłby ten sam. Niemniej jednak przesyłam, może się komuś przyda. Pozdrawiam

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

namespace WypozyczalniaSamochodow
{
    internal class Program
    {
        class Samochod
        {
            private static int samochodCount = 0;
            private int index = 0;

            private string marka { get; set; }
            private string model { get; set; }
            private int rokProdukcji { get; set; }
            private bool czyDostepny { get; set; }

            private string Silnik { get; set; }

            public Samochod(string ma, string mo, int rp, string sil, bool czD)
            {
                this.index = samochodCount++;

                marka = ma;
                model = mo;
                rokProdukcji = rp;
                czyDostepny = czD;
                Silnik = sil;
            }

            public void WyswietlInformacje()
            {
                Console.WriteLine($"Index: {index}\nMarka: {marka}\nModel: {model}\nRok produkcji: {rokProdukcji}\nSilnik: {Silnik}\nDostępny: {czyDostepny}");
                Console.WriteLine("---------------------");
            }


            public void NoweDaneSamochodu(string nowySilnik)
            {
                Silnik = nowySilnik;
            }

            public void Wypozyczony(bool nie)
            {
                czyDostepny = nie;
            }
        }

        static void Main(string[] args)
        {
            //Tworzenie samochodów
            Samochod sam1 = new Samochod("Toyota", "Corolla", 2000, "1.6", true);
            Samochod sam2 = new Samochod("Mercedes", "CLK", 2005, "2.0", true);
            Samochod sam3 = new Samochod("Honda", "Civic", 2015, "1.4", true);


            //Dodanie samochodów do listy
            List<Samochod> listaSamochodow = new List<Samochod> { sam1, sam2, sam3 };

            //Wyświetlenie samochodów
            Console.WriteLine(" --- Samochody wypożyczalni --- \n");
            foreach (Samochod sam in listaSamochodow)
            {
                sam.WyswietlInformacje();
            }

            //Zmiana danych
            Console.WriteLine("Podaj numer indeksu samochodu do zmiany: ");
            int nrSam = int.Parse(Console.ReadLine());

            Console.WriteLine("Podaj nowe dane silnika:");
            string nowySilnik = Console.ReadLine();
            listaSamochodow[nrSam].NoweDaneSamochodu(nowySilnik);

            Console.WriteLine(" --- Samochody po zmianie --- \n");
            foreach (Samochod sam in listaSamochodow)
            {
                sam.WyswietlInformacje();
            }

            //Wypozyczenie samochodu
            Console.WriteLine("Czy chcesz wypożyczyć samochód wybierając przez indeks (i) czy markę (m) ?");
            string wybor = Console.ReadLine();
            if (wybor == "i")
            {
                Console.WriteLine("Podaj indeks: ");
                nrSam = int.Parse(Console.ReadLine());
                bool niedostepny = false;
                listaSamochodow[nrSam].Wypozyczony(niedostepny);
            }
            if (wybor == "m")
            {
                Console.WriteLine("Podaj markę: ");
                string markaSam = Console.ReadLine();

                switch (markaSam)
                {
                    case "Toyota":
                        listaSamochodow[0].Wypozyczony(false);
                        break;
                    case "Mercedes":
                        listaSamochodow[1].Wypozyczony(false);
                        break;
                    case "Honda":
                        listaSamochodow[2].Wypozyczony(false);
                        break;
                }
            }


            Console.WriteLine(" --- Samochody po zmianie --- \n");
            foreach (Samochod sam in listaSamochodow)
            {
                sam.WyswietlInformacje();
            }

        }
    }
}
hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
0

To jest przerost formy nad treścią, łatwiej byłoby użyć do tego bazy danych.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.