Typy generyczne - wyświetlanie w konsoli

0

Witam.
Mam do zrobienia na jeden z przedmiotów prostą aplikacje konsolową i obecnie przerabiamy typy generyczne - list<T>
Co nie działa? W konsoli odpalam program i normalnie prosi mnie o to co mam tam wpisać, ja wpisuje a potem ma mi wyświetlić, i tu jest problem. Na początek zaprezentuję kod:

klasa Lista

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

namespace BibliotekaKlas
{
    public class Lista
    {
        private List<Pracownik> lista;
        public Lista()
        {
            lista = new List<Pracownik>();
        }

        public void Dodaj(Pracownik pracownik)
        {
            lista.Add(pracownik.Clone());
        }

      
        public void ZapisConsole()
        {
            Pracownik pracownik = new Pracownik();
            pracownik.ZapisConsole();
            
        }

        public void OdczytConsole()
        {
            Pracownik pracownik = new Pracownik();
            pracownik.OdczytConsole();
            lista.Add(pracownik);

        } 
    }
}

klasa Program (klasa główna)

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

namespace WierszPolecen
{
    class Program
    {
        static void Main(string[] args)
        {


            Lista lista1 = new Lista();
            lista1.OdczytConsole();
            lista1.ZapisConsole();

        }
    }
}

A tu część klasy Pracownik, dla wglądu jak wygląda metoda ZapisConsole

        public virtual string FormatWyjsciowy()
        {
            return "imię nazwisko:" + Imie + " " + Nazwisko + "\n Data urodzenia: " + dataUrodzenia.Dzien + " " + dataUrodzenia.Miesiac + " " + dataUrodzenia.Rok + "\n Adres zamieszkania: " + " " + adresZamieszkania.Ulica + " " + adresZamieszkania.NumerDomu + " " + adresZamieszkania.Miasto;
        }

        public virtual void OdczytConsole()
        {
            Console.Write("Podaj imie pracownika: ");
            imie = Console.ReadLine();
            Console.Write("Podaj nazwisko pracownika: ");
            nazwisko = Console.ReadLine();
            Console.Write("Podaj dzien urodzenia pracownika: ");
            dataUrodzenia.Dzien = int.Parse(Console.ReadLine());
            Console.Write("Podaj miesiac urodzenia pracownika: ");
            dataUrodzenia.Miesiac = Console.ReadLine();
            Console.Write("Podaj rok urodzenia pracownika: ");
            dataUrodzenia.Rok = int.Parse(Console.ReadLine());
            Console.Write("Podaj adres zamieszkania pracownika \n ");
            Console.Write("Ulica ");
            adresZamieszkania.Ulica = Console.ReadLine();
            Console.Write("Numer domu ");
            adresZamieszkania.NumerDomu = Console.ReadLine();
            Console.Write("Miasto ");
            adresZamieszkania.Miasto = Console.ReadLine();

        }

        public virtual void ZapisConsole()
        {

            Console.WriteLine(FormatWyjsciowy());

        }

A co jak wygląda to w konsoli:

Podaj imie pracownika: jan
Podaj nazwisko pracownika: nowak
Podaj dzien urodzenia pracownika: 12
Podaj miesiac urodzenia pracownika: maj
Podaj rok urodzenia pracownika: 1989
Podaj adres zamieszkania pracownika
 Ulica kopernika
Numer domu 12A
Miasto Krakow
imię nazwisko:
 Data urodzenia: 0  0
 Adres zamieszkania:
Press any key to continue . . .

Próbowałem też w klasie Lista metodę ZapisConsole zrobić tak:

        public void ZapisConsole()
        {
            foreach (Pracownik p in lista)
            {
                Console.WriteLine(p);
            }
        }

ale tu tym bardziej nic nie działa. Mógłby ktoś pomóc, co tu poprawić. Z góry dziękuję za pomoc!

0

Nie wrzuciłeś klasy pracownik. Nie wiem jakie tam są property. Zgaduje.
Kod bardzo chaotyczny, bardzo na około robione. Ogólnie tragedia. Druga sprawa klepanie takich konsolowych jest kompletnie nieczytelne. Już lepiej to zrobić w oknie.
Co najważniejsze!!
W twoim kodzie nie ma nic generycznego. Zwyczajna operacja na listach. Jeśli chcesz żeby działało to co masz teraz to odpowiedź masz poniżej. Przerób sobie pod siebie.

public virtual void OdczytConsole()
        {
            Pracownik p = new Pracownik();
            
            Console.Write("Podaj imie pracownika: ");
            p.imie = Console.ReadLine();
            Console.Write("Podaj nazwisko pracownika: ");
            p.nazwisko = Console.ReadLine();
            Console.Write("Podaj dzien urodzenia pracownika: ");
            p.dataUrodzenia.Dzien = int.Parse(Console.ReadLine());
            Console.Write("Podaj miesiac urodzenia pracownika: ");
            p.dataUrodzenia.Miesiac = Console.ReadLine();
            Console.Write("Podaj rok urodzenia pracownika: ");
            p.dataUrodzenia.Rok = int.Parse(Console.ReadLine());
            Console.Write("Podaj adres zamieszkania pracownika \n ");
            Console.Write("Ulica ");
            p.adresZamieszkania.Ulica = Console.ReadLine();
            Console.Write("Numer domu ");
            p.adresZamieszkania.NumerDomu = Console.ReadLine();
            Console.Write("Miasto ");
            p.adresZamieszkania.Miasto = Console.ReadLine();
            
            List<Pracownik> lista1 = new List<Pracownik>();
            lista1.Add(p);

            foreach (Pracownik prac in lista1)
            {
                Console.WriteLine("imię nazwisko:" + p.Imie + " " + p.Nazwisko + "\n Data urodzenia: " + p.dataUrodzenia.Dzien + " " + p.dataUrodzenia.Miesiac + " " + p.dataUrodzenia.Rok + "\n Adres zamieszkania: " + " " + p.adresZamieszkania.Ulica + " " + p.adresZamieszkania.NumerDomu + " " + p.adresZamieszkania.Miasto;);
            }
        }
1

IMO problem jest tutaj:

public void ZapisConsole()
        {
            Pracownik pracownik = new Pracownik();
            pracownik.ZapisConsole();

        }

Tworzysz nowego (pustego) pracownika i to jego wyświetlasz, kiedy na liście robisz operację ZapisConsole().

0

Tak jak zauważył @Ktos metoda ZapisConsole() tworzyła nowy obiekt i go wyświetlała, a że był pusty to wyświetlał wartości domyślne. Chwilę rozkminiałem, jak w takim razie to naprawić. Bo teoretycznie poniższy kod powinien działać:

        public void ZapisConsole()
        {
            foreach (Pracownik p in lista)
            {
                Console.WriteLine(p);
            }
        }

Ale nie wyświetlał nic. Więc poszedłem trochę na skróty i zrobiłem coś takiego:

        public void ZapisConsole()
        {
            foreach(Pracownik p in lista)
            {
                Console.WriteLine("imię nazwisko:" + p.Imie + " " + p.Nazwisko + "\n Data urodzenia: " + p.DataUrodzenia.Dzien + " " + p.DataUrodzenia.Miesiac + " " + p.DataUrodzenia.Rok + "\n Adres zamieszkania: " + " " + p.AdresZamieszkania.Ulica + " " + p.AdresZamieszkania.NumerDomu + " " + p.AdresZamieszkania.Miasto);
            }
            
        }

i teraz działa elegancko. Może kod nie wygląda za ładnie, ale już działa jak należy. To tak wrzucam jakby ktoś w przyszłości szukał podobnego rozwiązania. :)

2
 public void ZapisConsole()
 {
     foreach (Pracownik p in lista)
     {
         p.ZapisConsole();
     }
 }

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