C# Mehrere Datentypen in eine Liste

SubNatural

Commander
Registriert
Jan. 2009
Beiträge
2.877
Hallo,

ich würde gerne wissen, wie ich mehrere Datentypen in eine Liste bekommen.
Beispiel:
Ich möchte eine Klassenverwaltung schreiben, also erstelle ich eine Klasse und lade den Namen in eine List<string>. Soweit so gut, nun möchte ich aber noch Schüler erstellen.
Dazu habe ich eine Klasse SchuelerErstellen, diese setzt bei einem Klick auf Anlegen alle Daten(Klasse(int),Name,Vorname,Geburtstag(DateTime),Adresse,etc) mit den jeweiligen Inhalten der textbox.
Wie bekommen ich diese Daten nun in eine List? Bzw. welchen Typ muss die Liste haben

Danke
 
Hi,

ich verstehe dein Problem nicht so ganz... benutze doch einfach eine List<string>? Oder verstehe ich das Problem jetzt falsch? Oder möchtest du eine List<SchulerErstellen> (was btw ein denkbar schlechter Bezeichner für eine Klasse ist, nur so als Anmerkung!)?

Eine Liste mit unterschiedlichen Typen macht wenig Sinn, dann ist es per Definition einfach keine Liste.

Oder was genau hast du vor, was soll passieren? Wenn einfach nur alle Daten irgendwie angezeigt werden sollen dann benutz string...

VG,
Mad
 
Im Endeffekt soll es drei Listen geben, eine Liste mit Klassen, eine welche die Klassen mit dem Schülern verkuddelt und eine, die die Schülerdaten speichert.
Das Problem ist, dass ich nicht weiß, wie ich die vielen SchuelerDaten in eine Liste quetschen soll(oder muss ich für jedes Schülerattribut eine Liste erstellen?

[Klassen] - [Klassen|Schueler] - [Schuelerdaten]
 
Also wenn jeder Schüler genau in einer Klase sein darf, dann solltest du dir diese Klassen anlegen:

Code:
class Schüler
{
      public string Vorname {get; set;};
      public string Nachname {get; set;};
      usw, usf... Also alles was du als Attribute für Schüler brauchst
}

class Klasse
{
     public int Klassennummer { get; set; };
     public List<Schüler> SchülerInKlasse;
}

Du kannst dann mit

List<Klasse> Klassen;
eine Anzahl von Klassen definieren. In jeder Klasse gibt es dann eine Liste mit Schülern.

Beim Spichern kannst du dann mit 2 foreach-Schleifen die Daten bequem abgreifen und speichern.

Code:
foreach (Klasse k in Klassen)
{
   foreach {Schüler s in k.SchülerInKlasse}
   {

   }
}
 
Zuletzt bearbeitet:
Das ist aber nicht sehr objektorientiert. Ich finde diesen Ansatz besser:
Code:
class Klasse {
String name;
String teacher;
List<Schueler> schueler;
}

class Schueler {
String name;
Date bday;
}

... // tue etwas


main() {
List<Klasse> klassen;
...
}

Ich kann kein C# aber ich denke der Code sollte klar sein.

EDIT

Ich würde keine Tabellen verwenden, das ist ebenfalls nicht objektorientiert.

EDIT2
Dem angepassten Post von MacGyver kann ich nur zustimmen.
 
Zuletzt bearbeitet: (Hinzufügen)
@Madman: Es soll mir Listen gemacht werden, aber wenn das nicht geht, nehm ich auch eine Tabelle
@MacGyver: Es soll aber variabel sein, also nichts Hartcodiertes
 
Hi,

wieso sind Tabellen denn für die ANZEIGE nicht objektorintiert? Mir ging es nur um das Anzeigen. Das andere Problem sehe ich nicht, da er (wie ich oben schon geschrieben habe) doch eifnach eine List<schueler> machen kann. Was meine Tabelle als Datengrundlage hat spielt doch keine Rolle. Du hast doch selber den Ansatz geliefert, den ich von der Programmierung auch schon im ersten Post geschrieben habe:

List<Schueler>

Die Tabelle ist nur für die Anzeige gedacht, ich habe es so verstanden, dass das das Problem ist. Wenn es nur um die Programmierung geht verstehe ich das Problem umso weniger :)

VG,
Mad
 
Zuletzt bearbeitet:
Ich kann mir zwar nicht vorstellen warum aber verwende
List<object> dies kannst dann mit allem möglichen füllen.. also entweder der Klassen ansich oder nur Geburtsdatum oder eine kombination aus Geburtsdatum, Alter, Name.. da sie alle von object ableiten..
 
Darktrooper1991 schrieb:
@MacGyver: Es soll aber variabel sein, also nichts Hartcodiertes

Das Klassenmodell ist doch variabel. Eine variable Anzahl von Klassen und eine variable Anzahl von Schülern pro Klasse. Da ist nichts hardcodiert, sondern lediglich definiert.

Kannst 10 Klassenräume oder 1000 erstellen und in jedem Klassenraum gibts ne Liste von Schülern. Auch hier entweder 10 oder 1000 oder 100000.

So entfällt auch die Notwendigkeit einer dritten Klasse (KlassenSchüler) weil die Zuordnung schon durch das Modell erfolgt.
 
Zuletzt bearbeitet:
Hi,

weil ich als Visualisierung Tabellen für die Daten vorgeschlagen hatte :) Nicht das Datenmodell sondern das Visualisierungsobjekt hatte ich gemeint :)

VG,
Mad
 
List<Object> Ich glaub es geht los. Vll bist du ja kein fortgeschrittener Programmierer, trotzdem solltest du dir guten Stil angewöhnen und List<Object> hat in den seltensten Fällen (nicht nur in C#, genauso in Java) eine Daseinsberechtigung.
Und wenn du nicht gerade das Befehls-Entwurfsmuster benutzt, halte ich es ebenfalls für fragwürdig eine Klasse SchülerErstellen anzulegen. Beim Software-Design werden Verben meist als Methoden abgebildet und Substantive als Klasse. Also eine Klasse "Schüler" und eine Methode "erstellen" welche dir einen Schüler erstellt, in dem Fall wohl einfach der Konstruktor der Klasse Schüler.

@Madman1209
Ich bin mir nicht sicher ob ich dich ganz verstehe. Aber aus dem Objekten kann er ja die Information ziehen, wenn er etwas anzeigen möchte.
z.B. klassen.getListElement(0).getSchuelerListe.size() wie gesagt ich kenne die C#Methode nicht, aber so kommt er objekt-orientiert zum Beispiel an die Klassengröße des ersten Listelements in der Liste "klassen". Man kann natürlich noch ein paar Methoden hinzufügen, so dass man sich nicht die Klassenreihenfolge in der Liste merken muss, sondern z.B. über den Lehrernamen an die Klasse kommt etc.
 
Hi,

@MR34L

Genau so hatte ich es ja gemeint. Das Datenproblem ist an sich keines, wenn er sich eine List<Schueler> bastelt. Daher hatte ich "Tabelle" als visuelle Komponente in den Raum geworfen.

List<object> ist wirklich Nonsens... das bringt überhauptnichts, das ist der reinste Müllschlucker, Spiecherfressenr und nicht typsicher. Hände weg!

VG,
Mad
 
Hier ein beispiel wie man das schön objektorientiert lösen könnte. :

Code:
        class Schüler
        {
            public string Vorname {get; set;}
            public string Nachname {get; set;}

            public Schüler(string vn,string nn)
            {
                Vorname = vn;
                Nachname = nn;
            }
        }
     
        class Schulklasse
        {
            public int Klassennummer { get; set; }
            public List<Schüler> SchülerInKlasse;

            public Schulklasse(int Nummer)
            {
                Klassennummer = Nummer;
                SchülerInKlasse = new List<Schüler>();
            }
        }

        private List<Schulklasse> Klassen;

        private void Form1_Load(object sender, EventArgs e)
        {
           Klassen = new List<Schulklasse>();
        }

        private void btnSchülerHinzufügen_Click(object sender, EventArgs e)
        {
            // Ein Schüler wird hinzugefügt. ACHTUNG: Ohne Fehlerprüfungen !!!
            int klnr = Convert.ToInt32(txtKlassennummer.Text);
            
            Schulklasse klasse = Klassen.Find(p=>p.Klassennummer == klnr);
            if (klasse == null)
            {
                Klassen.Add(new Schulklasse(klnr));
                klasse = Klassen.Find(p => p.Klassennummer == klnr);
            }

            Schüler s = new Schüler(txtVorname.Text, txtNachname.Text);
            klasse.SchülerInKlasse.Add(s);
        }

Von einer einzigen Liste die einfach nur die Daten hintereinanderweg speichert halte ich nicht viel.
Das ist unübersichtlich und in einer objektorientierten Umgebung wie CSharp unüblich.
 
Hi,

MacGyver hat Recht (hach ich liebe diesen Satz) :) Finde ich so sehr schön gelöst...

VG,
Mad
 
Noch einen winziger OOP Tipp hätte ich aber noch Klassenattribute immer private (Datenkapselung). So dass nur die Klasse selbst sie verändern kann, andere Klassen müssen Getter/Setter-Methoden aufrufen.
 
Zurück
Oben