Auf ArrayList zugreifen
-
Hallo zusammen!
Ich habe eine etwas komplexere Struktur mit einer Arraylist. Leider weiß ich jetzt nicht, wie ich auf die Daten zugreifen kann. Könntet ihr mir da bitte einen Anhaltspunkt geben?
Ich habe ein Beispiel gebaut.
using System; using System.Xml; using System.Collections; using System.Collections.Generic; using System.Text; namespace AlTester { class Program { static void Main(string[] args) { TestList testlist = new TestList("Test"); Test new_test = new Test("hallo!"); testlist.Test.Add(new_test); Console.WriteLine("Hier würde ich gerne auf das 'hallo' zugreifen"); Console.ReadLine(); } public class TestList { [XmlElement("listidentifier")] public string Listidentifier; public ArrayList Test = new ArrayList(); public TestList() { } public TestList(string identifier) { this.Listidentifier = identifier; } } public class Test { [XmlElement("Test")] public string test; public Test() { } public Test(string test) { this.test = test; } } } }
Ich möchte auf das hallo zugreifen und es ausgeben. Könnt ihr mir helfen?
Viele Dank!
-
Der Zugriff erfolgt über den Index Operator.
(Oder über einen Enumerator, google mal danach)int index = 0; object item = testlist.Test[index]; string str = (string) item;
Allerdings gibt es noch zwei Dinge anzumerken:
1. Membervariablen sollen nicht public sein (Kapselung).
2. Verwende besser die generische Version von ArrayList: List<T>
So sparst Du die das ge-caste und bei Werte- Typen das Boxing / Unboxing.Grüsse
Simon
-
Hi!
Danke für deine Antwort. So hatte ich es auch schon probiert. Leider kommt dabei nicht das heraus, was ich mir erhofft hatte.
Es sieht jetzt so aus:
using System; using System.Xml; using System.Collections; using System.Collections.Generic; using System.Xml.Serialization; using System.Text; namespace AlTester { class Program { static void Main(string[] args) { TestList testlist = new TestList("Test"); Test new_test = new Test("hallo!"); testlist.Test.Add(new_test); int index = 0; object item = testlist.Test[index]; :open_mouth: string str = (string) item.ToString(); Console.WriteLine(str); Console.ReadLine(); } public class TestList { [XmlElement("listidentifier")] public string Listidentifier; public ArrayList Test = new ArrayList(); public TestList() { } public TestList(string identifier) { this.Listidentifier = identifier; } } public class Test { [XmlElement("Test")] public string test; public Test() { } public Test(string test) { this.test = test; } } } }
Ausgeben wird
AlTester.Program+Test
Ich greife ja auch nur das Objekt Test zu. Dabei möchte ich auf die Eigenschaft test des Objekts zugreifen. Ich müsste doch eigentlich per
object item = testlist.Test[index].test;
auf "hallo" zugreifen können. Aber das ist so nicht erlaubt. Wie kann ich das dann machen?
Viele Grüße
PS: das mit der Liste schaue ich mir mal an. Danke für den Tip.
-
object item = testlist.Test[index]; :open_mouth:
das Smiley ist mir da rein gerutscht
-
Naja, Du sollst das Objekt ja auch auf den Typ casten, den es vorher hatte, string war nur ein Beispiel. Ausserdem brauchst Du das Ergebnis von ToString() nicht mehr nach string casten, denn ToString gibt (wie im Namen sehr schön angedeutet wird) bereits einen string zurück.
Also, versuch mal "item" nach Test zu casten, und nicht nach string, und dann kannst Du auch auf die Properties des Typs Test zugreifen.
EDIT:
D.h. in diesem Teil von Simonint index = 0; object item = testlist.Test[index]; string str = (string) item;
"string" durch "Test" ersetzen. Der Rest ist Analogieübung
-
Perfekt!
Jetzt weiß ich auch was "casten" ist.
Vielen vielen Dank für die Hilfe!
-
Ui, das mit dem casten nach string war mein Fehler... hab falsch gelesen.
Sorry.
-
Gast2 schrieb:
Perfekt!
Sorry, aber das ist alles andere als perfekt!
Jetzt weiß ich auch was "casten" ist.
Aber Du hast Simon trotzdem nur halb zugehört. Casten ist hier einfach der falsche Weg. Du verwendest die falsche Datenstruktur. 'ArrayList' ist veraltet. Verwende die 'List<string>' und informier Dich über generische Datentypen. Und dann entfern aus Deiner Imports-Liste den Eintrag 'System.Collections' und verwende stattdessen nur noch die Klassen aus 'System.Collections.Generic'.
-
Konrad Rudolph schrieb:
Verwende die 'List<string>' und informier Dich über generische Datentypen.
Um dem bereits aufgetretenen Missverständnis vorzubeugen: List<Test>
-
Ok. Ich hatte nicht gedacht dass es so schlimm sei.
Dann werde ich das ganze auf List umstellen. Auch wenn es sehr umständlich sein wird. Nur meine Frage:
Ist ArrayList komplett veraltet? Soll man ArrayList überhaupt nicht mehr verwenden?Viele Grüße
-
Gast2 schrieb:
Dann werde ich das ganze auf List umstellen. Auch wenn es sehr umständlich sein wird.
Hmm, wieso umständlich? Eigentlich wird dadurch alles einfacher.
Ist ArrayList komplett veraltet? Soll man ArrayList überhaupt nicht mehr verwenden?
Genau das. Die 'ArrayList' bietet gegenüber der generischen 'List<T>' keinerlei Vorteile und einige handfeste Nachteile. Die zwei größten Vorteile der 'List<T>' sind einfach, dass man zum einen klareren Code schreibt weil zum einen das ganze Gecaste wegfällt, was den Code nur aufbläht, zum anderen sind die verwendeten Typen besser ersichtlich.
Der andere große Vorteil ist, dass die 'List<T>' bereits zur Compilezeit viel mehr potentielle Fehler auffängt, weil sie einfach eine wesentlich striktere Typenprüfung ermöglicht.