Utworzenie obiektów z pliku/listy

0

Cześć.
Mam plik z danymi postaci: imie,nazwisko;
Tworzę w programie z nich listę.
Czy mogę utworzyć dla każdego elementu z listy nowy obiekt?
Tak żeby dla wybranego obiektu móc używać metod itd?
Tutaj kod programu.
W pętli foreach metoda robi to co powinna ale obiekt jest ciągle nadpisywany. Jak osiągnąć efekt aby każda linia była nowym obiektem?

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace plikitekstowe
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<string> osoby = new List<string>();
            StreamReader sr = new StreamReader("tekst.txt");//tu mam listę osób imie,nazwisko
            string tekst= sr.ReadLine();
            while (tekst!=null)

            {
                osoby.Add(tekst);  ///tutaj otrzymuję listę osób z pliku
                tekst = sr.ReadLine();  
            }
            sr.Close();
            foreach (var item in osoby)
            {
                Osoby osoba = new Osoby(item.Split(',')[0] , item.Split(',')[1]);
                osoba.PrzedstawSie();
            }
            Console.WriteLine();
            ///Chciałbym tutaj móc użyć metody PrzedstawSie() dla konkretnego obiektu osoba
            //np osoba[0].PrzedstawSie()
              //  osoba[1].PrzedstawSie()
           
           
           
            Console.ReadKey();
        }
    }
}

Tutaj kod napisanej klasy

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

namespace plikitekstowe
{
    internal class Osoby
    {
        string Imie;
        string Nazwisko;
        public Osoby(string imie, string nazwisko)
        {
            Imie = imie;
            Nazwisko = nazwisko;
        }

        public void PrzedstawSie() 
        {
            Console.WriteLine("Nazywam się "+Imie);
        }
        
    }

   
}


0
List<string> osoby = new List<string>();

Zrób listę Osoby, a nie nie stringów - List<Osoby>

A najlepiej to zmień nazwę tej klasy na Osoba, bo reprezentuje jedną osobę.

0

Czyli tak?

List<Osoby> osoby = new List<Osoby>();

Jak teraz do tej listy wczytać dane z pliku?

0

Musisz dostosować aktualne dodawanie do typu Osoby

Czyli zmodyfikuj to

osoby.Add(tekst);

Korzystając z tego co robiłeś wcześniej

new Osoby(item.Split(',')[0] , item.Split(',')[1])

i wyjdzie ci coś typu

osoby.Add(new Osoby(...))

W miejsce kropek wstaw odpowiednio imie oraz nazwisko

0

Super, działa. Z kursów jakoś nie mogłem ogarnąć jak to zrobić.Dzięki. Działający kod:

List<Osoby> osoby = new List<Osoby>();
            StreamReader sr = new StreamReader("tekst.txt");//tu mam listę osób imie,nazwisko
            var tekst= sr.ReadLine();
            while (tekst!=null)

            {
                osoby.Add(new Osoby(tekst.Split(',')[0], tekst.Split(',')[1]));  ///tutaj otrzymuję listę osób z pliku
                tekst = sr.ReadLine();  
            }
            sr.Close();
            osoby[0].PrzedstawSie();
            osoby[3].PrzedstawSie();

0

No faktycznie readalllines wygodniej użyć, mniej pisania.
A taki StreamReader do czego w takim razie warto używać?

1

Jakbyś miał ogromny plik którego nie chciałbyś całego wczytać na raz (bo np. pamięci by brakło), to wtedy StreamReader.

File.Read* dla "normalnych" plików

0

Ja napiszę tylko, że dobrze robisz. To jest uważam bardzo ciekawe i w sumie jedna z najbardziej kluczowych rzeczy w programowaniu i warto żebyś dalej działał w tej dziedzinie. Piszę to bo zauważyłem, że masa ludzi tu wchodzi z jakimiś porąbanymi nudnymi kawałkami kodu i proszą o pomoc. I jak napiszą ten nudny kod to zaraz wpadną na pomysł, żeby wyklepać coś jeszcze nudniejszego i jeszcze bardziej skomplikowanego (i to da się zrobić ,bo w programowaniu prawie wszystko jest możliwe, i na dodatek znajdą tu ludzi którzy im to pomogą zrobić - dla mnie to wygląda jak taka sytyuacja - "człowiek stuka łopatą w ścianę i krzyczy 'koledzy pomóżcie!' i koledzy biegną pomagać i pokazują mu i mówią 'o tak się stuka prawidłowo łopatą w ścianę!' - a potem sobie gratulują"), i to według mnie nie ma sensu. Tworzenie struktury obiektowej z elementów zawartych w pliku jest genialnym pomysłem na podniesienie swoich umiejętności w programowaniu. Gdybym pisał książkę do programowanie to byłaby jedna z istotniejszych rzeczy. A jak jeszcze wyraźnie widzisz tego umiejscowienie w pamięci, rolę jaką to odgrywa w całości, szybko potrafisz modyfikować i samą strukturę i obiekty fizycznie w niej zawarte i generować na ich podstawie nowe pliki tekstowe z odpowiednim umiejscowieniem elementów to już jest rewelka. Tak, to jest ciekawe i przydatne i kreuje świadomość programistyczna. Pochwała słowna. Nie piszę tym co z pomocą forumowiczów brną w jakieś bezużyteczne idiotyzmy bo zostanę oskarżony o hejt. Więc moja postawa jest taka , żeby nagradzać działania które uważam za sensowne i warte zachodu. I tutaj właśnie to dostrzegłem. Trochę dziwi mnie, że ludzie prawie w ogóle nie przychodzą do mnie po radę w stylu "czy warto robić to co robię, czy to rozwinie mnie jako programistę?" Ale ja się nikomu w życie z butami nie pcham. Nie mój czas nie moja strata.Pozdrawiam.

0

Jak by jeszcze ktoś mi mógłby wyjaśnić to:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form

    {
        public List<Kontakt> Ludzie = new List<Kontakt>();
        public Form1()
        {
            
            Ludzie.Add(new Kontakt("Mariusz", "Studziński", 72515190));
            Ludzie.Add(new Kontakt("Adam", "Mickiewicz", 123789456));
           Ludzie.Add(new Kontakt("Czesław", "Miłosz", 741852963));
            InitializeComponent();
        }

      

        private void Form1_Load(object sender, EventArgs e)
        {
            
            dG1.DataSource= Ludzie;//wyświetlanie obiektów w DataGrid
                       
           
        }
       


    }
}

Dla nauki stworzyłem aplikacje WinForm i tam chce wyświetlać obiekty w DataGrid. O ile górny kod rozumiem to dlaczego w klasie jest wymagane

{get;set;}

Bez tego tabela wyświetla się pusta. Tutaj kod klasy:

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

namespace WindowsFormsApp3
{
    public class Kontakt
    {
        public string Imie{ get; set; }//jak to usunę nic się nie wyświetla
        public string Nazwisko { get; set; }
        public int Numer { get; set; }

        public Kontakt(string imie, string nazwisko, int numer)
        {
            Imie = imie;
            Nazwisko = nazwisko;
            Numer = numer;
        }
    }
}

3

Jeśli powiem "bo tak", to będzie dobrze? ;)

To {get; set;} tworzy tzw. właściwość (property). Właściwość działa jakby była polem, ale pod spodem tak naprawdę uruchamia specjalne metody – w takiej wersji z prostym, automatycznie generowanym kodem, nic specjalnego się nie dzieje, ale można to rozbudować.

Właściwości są typowym spodobem na robienie publicznych składowych obiektów w C#. Ot, taka konwencja – raczej preferuje się właściwości niż pola, a na pewno zamiast metod typu getImie() i setImie().

I wiele "magicznych" narzędzi w rodzaju Entity Framework, czy tak jak widzisz – DataGrid – oczekuje, że dane będą właściwościami, a nie polami, ponieważ poprzez mechanizm refleksji wyszukują wszystkie właściwości i na tej podstawie operują. Jeżeli coś nie ma {get; set;} (albo jego rozbudowanej wersji) to nie jest właściwością, więc jest ignorowane przez te mechanizmy.

1
Ktos napisał(a):

Właściwości są typowym spodobem na robienie publicznych składowych obiektów w C#. Ot, taka konwencja – raczej preferuje się właściwości niż pola, a na pewno zamiast metod typu getImie() i setImie().

Powiedzmy wyraźniej.

Własciwośći są w zasadzie jedynym oficjalnym wystawieniem danych tak, aby były łykane przez GUI, raporty, gridy itd..
Publiczne pole czy publiczna metoda nie ma takich cech - tak się umówiliśmy w C#

Na marginesie, moim zdaniem sformalizowanie property w C#, z własnym syntaxem, jest fantastyczną decyzją projektową.
Na brak takiej decyzji cierpi czy Java, czy C++

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