[C#] Problem z ArrayList i serializacją itp

0

Hej! Mam pewien problem...
Chciałem w C# zrobić coś podobnego jak w Pascalu były rekordy plikowe...

Próbuje zapisywac wszystko do klasy typu ArrayList, problem w tym,ze potrzebne jest ok 40 pól, przez co klasa nie moze miec tylu konstruktorów... Więc wpadłem na pomysł zrobić 2 klasy...
Jedna byla by pomocnicza w ktorej zapisywane jest 40 pol danych, plus druga ktora zawiera ta klase z 40 danymi.. ale problem,ze nic nie zapisuje :/
Ma ktos jakas koncepcje???
Może ktoś zna sposób w jaki można prost zapisać klase (strukture) skladajaca sie z np 30-40 pol, i np takich kopii klas kilka razy zapisac.. .Coś jak pliki typowane w Pascalu....


// tutaj jest sporo pol

class OsobyStruktura
{
    public string Imie;
    public string Nazwisko;
   //itp... ze 40 zmiennych :)

    // konstruktory
    public OsobyStruktura() { }

    public OsobyStruktura( string _Imie,
     string _Nazwisko, // itp....)
    }




}

class Osoby2
{

    OsobyStruktura DaneOsoby;
    //


    // konstruktory
    public Osoby2() { }

    public Osoby2(
     OsobyStruktura _DaneOsoby
)
    {
        DaneOsoby = _DaneOsoby;
    }
}

...

ArrayList ListaOsob = new ArrayList();
            OsobyStruktura MojeOsoby = new OsobyStruktura();
            MojeOsoby.Imie = "AAA";
            //... tutaj zapisanie reszty zmiennych

  
            ListaOsob.AddRange(new Osoby2[] {new Osoby2(MojeOsoby)});
            MessageBox.Show(MojeOsoby.Imie);
   
            foreach (Osoby2 o in ListaOsob)
{
                MessageBox.Show(o.Imie);
// itp ... wyswietlenie tych 40 zmiennych, niestety ciagle puste wartosci...
}

Ehhh nie mam juz glowy do tego :(

Moze ktos zna inny sposob,zeby "zasymulowac" pliki typowane w Pascalu :)

0

A gdzie Osoby2 ma właściwość Imie? I w ogóle po co ta klasa, jaką ona pełni funkcję? I czemu używasz prehistorycznego ArrayList?

Ja bym zrobił List<OsobyStruktura> po prostu.

0
somekind napisał(a)

A gdzie Osoby2 ma właściwość Imie? I w ogóle po co ta klasa, jaką ona pełni funkcję? I czemu używasz prehistorycznego ArrayList?

Ja bym zrobił List<OsobyStruktura> po prostu.

Hmm no Osoby2 zawiera klase OsobyStruktura ktore maja pole Imie..
Tzn jak to zrobic z ta List??
I bedzie sie dalo tak jak rekordy zapisywac??
Sorry ale troche ciemny jestem z tego jezyka, ucze go sie samemu :)

0
LOSMARCELOS napisał(a)

Sorry ale troche ciemny jestem z tego jezyka, ucze go sie samemu :)

No tak to masz gorzej jak samemu, my wszyscy tu uczyliśmy się wspolnie u mnie w domu. Samemu to się nie nauczysz, nie ma szans..

0
Pytong napisał(a)

my wszyscy tu uczyliśmy się wspolnie u mnie w domu. Samemu to się nie nauczysz, nie ma szans..

[rotfl] [rotfl] [rotfl]

@LOSMARCELOS - uproszczona klasa:

class OsobyStruktura
{
    public string Imie { get; set; }
    public string Nazwisko{ get; set; }
}

Użycie w kodzie:

List<OsobyStruktura> osoby = new List<OsobyStruktura>();
osoby.Add(new OsobyStruktura(){ Imie="aaa", Nazwisko="bbb" };
osoby.Add(new OsobyStruktura(){ Imie="ccc", Nazwisko="ddd" };

foreach(var o in osoby)
{
    MessageBox.Show(o.Imie + " " + o.Nazwisko);
}
0

poczytaj o serializacji

0

Twoje dwie klasy nie mają żadnego sensu. Co chciałeś osiągnąć opakowując jedno w drugie?
Po drugie, poza class jest jeszcze coś takiego jak struct, czyli odpowiednik recorda z Pascala. poczytaj czym w C# się różni klasa od struktury.
Po trzecie, dokładne naśladowanie pascalowych plików rekordowych (np. celem zapisu lub odczytu już istniejących takich plików) jest w C# wybitnie utrudnione. Dlatego będziesz zachęcany do korzystania z serializacji albo XML.
Ale zanim do tego dojdziemy, na razie masz nieistniejące problemy z jakimiś 40 konstruktorami...

Po czwarte, używasz stringów. Musisz się zdecydować, w jaki sposób chcesz te stringi zapisywać do pliku, bo typ string jest tu klasą, czyli reference-type. Referencja to coś jak wskaźnik, nie zawiera danych. Zapis samej referencji do pliku nie ma sensu.

Jeśli potrzebujesz trzymać się ściśle pascalowego formatu, musiałbyś zdefiniować w C# pascalowego stringa. To znowu będzie trudne (C# nie lubi grzebania mu w bajtach po pamięci) ale możliwe, zrobiłem to kiedyś.

Ogółem: sporo kombinowania, a ma to sens tylko gdy faktycznie format pliku masz taki narzucony.
Inaczej użyj mechanizmów typowych dla C#, czyli serializacji.

0

Tak przy okazji to do tego projektu można wykorzystać technologię LINQ.... mam nadzieje,ze bedzie wystarczajaco szybka... tak dla ok 2000 "rekordów"

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