Entwickler-Ecke
Basistechnologien - Ausgeben von Arraylist mit ArrayList.Item?
gage - Di 03.11.09 15:11
Titel: Ausgeben von Arraylist mit ArrayList.Item?
Hallo,
Ich habe ein kleines problem ich möchte aus einer Arraylist (Name und Nachname) wieder auslesen. Ich habe mir jetzt ein Beispiel mit Zahlen gemacht damit ich das erst mal zum laufen bekomme. Ich bekomme eine ArgumentOutOfRangeException obwohl der eingegebene Index in der Liste ist.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| class Program { static void Main(string[] args) { ArrayList myList = new ArrayList(); int i;
for (i = 0; i < 5; i++) myList.Add(i);
myList.Add("Hello");
for (i = 0; i < myList.Count; i++) { Console.WriteLine("Element {0} is \"{1}\"", i, myList[i].ToString()); }
Console.WriteLine(); foreach (object o in myList) { Console.WriteLine(o); } Console.WriteLine("Bitte die Zahl eingeben"); myList[i] = Console.ReadLine(); Console.WriteLine("Element {0} is \"{1}\"", i , myList[i]);
} } } |
Ich möchte z.B. die Zahl 4 wieder ausgeben. der Fehler kommt in der Zeile
myList[i] = Console.ReadLine();
warscheinlich wird da der Code nicht Stimmen nehme ich jetzt mal an.
also bei msdn.microsoft.com sieht der Code so aus:
C#-Quelltext
1: 2: 3: 4:
| stringList[2] = "abcd"; Console.WriteLine("Element {0} is \"{1}\"", 2, stringList[2]); |
Gruß
JüTho - Di 03.11.09 15:29
gage hat folgendes geschrieben : |
Ich bekomme eine ArgumentOutOfRangeException obwohl der eingegebene Index in der Liste ist.
Ich möchte z.B. die Zahl 4 wieder ausgeben. der Fehler kommt in der Zeile myList[i] = Console.ReadLine();
warscheinlich wird da der Code nicht Stimmen nehme ich jetzt mal an.
also bei msdn.microsoft.com sieht der Code so aus... |
Zwischen dem Code, den du von MSDN zitierst, und deinem eigenen kann ich keinerlei Zusammenhang erkennen. Außerdem gehen Beschreibung, Fehlermeldung und Code ziemlich durcheinander; es ist sehr schwer, dein Problem zu verstehen. Bitte versuche künftig, etwas strukturierter zu schreiben.
Die Variable i ist nur
innerhalb der beiden Schleifen mit Wert belegt. Üblicherweise wird sie auch innerhalb der Schleifen deklariert; dann kann es keinen Zweifel über den Gültigkeitsbereich geben. (Ich könnte mir vorstellen, dass der Compiler so ändert.)
C#-Quelltext
1: 2: 3:
| for (int i = 0; i < myList.Count; i++) { } |
Nebenbei: ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic.
Gruß Jürgen
gage - Di 03.11.09 15:38
Ich möchte an der Stelle wo im beim Beispiel
stringList[2] = "abcd"; angegeben ist eine Zahl von der tastatur einlesen und dann wieder ausgeben lassen. dies probiere ich mit diesem Code.
C#-Quelltext
1: 2: 3:
| Console.WriteLine("Bitte die Zahl eingeben"); myList[i] = Console.ReadLine(); Console.WriteLine("Element {0} is \"{1}\"", i , myList[i]); |
JüTho - Di 03.11.09 16:22
Wenn das dein Problem ist, dann machst du folgende Fehler:
* An dieser Stelle (außerhalb der Schleifen) hat i den letzten zugewiesenen Wert, und der ist gleich myList.Count - also größer als das mögliche Maximum. Daher auch ArgumentOutOfRangeException. (Es ist wohl doch so, dass der Compiler diese Variable nicht wegoptimiert.)
* Du weist dem Element einen String zu; das ist nämlich der Rückgabewert von ReadLine; es ist keine Zahl! Zuerst muss es konvertiert werden (am besten mit TryParse). Deshalb auch mein Hinweis, dass ArrayList Schrott völlig veraltet und unpraktisch ist.
Jürgen
gage - Di 03.11.09 17:10
JüTho hat folgendes geschrieben : |
Wenn das dein Problem ist, dann machst du folgende Fehler:
* An dieser Stelle (außerhalb der Schleifen) hat i den letzten zugewiesenen Wert, und der ist gleich myList.Count - also größer als das mögliche Maximum. Daher auch ArgumentOutOfRangeException. (Es ist wohl doch so, dass der Compiler diese Variable nicht wegoptimiert.)
* Du weist dem Element einen String zu; das ist nämlich der Rückgabewert von ReadLine; es ist keine Zahl! Zuerst muss es konvertiert werden (am besten mit TryParse). Deshalb auch mein Hinweis, dass ArrayList Schrott völlig veraltet und unpraktisch ist.
Jürgen |
Danke für die Tipps. Also schreibe ich
myList[i] = int.Parse(Console.ReadLine());
Aber dann habe ich immer noch das Problem mit der Exception was ich nicht raus bekomme.
Nemag - Di 03.11.09 17:16
Hab mir jetzt nicht alles durchgelesen. Was sagt denn deine Debugger dazu, wie groß ist denn die Liste wenn die Exception ausgelöst wurde?
Übrigens hat dich JüTho nicht auf int.Parse hingewiesen sondern auf int.TryParse.
gage - Di 03.11.09 17:44
Nemag hat folgendes geschrieben : |
Hab mir jetzt nicht alles durchgelesen. Was sagt denn deine Debugger dazu, wie groß ist denn die Liste wenn die Exception ausgelöst wurde?
Übrigens hat dich JüTho nicht auf int.Parse hingewiesen sondern auf int.TryParse. |
Ja ich meine ja auch TryParse :)
das war die meldung:
"Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein"
Muss ich eine neue variable wie int Index oder so etwas deklarieren?
weil so klappt es ja nicht
C#-Quelltext
1: 2: 3: 4: 5: 6:
| Console.WriteLine("Bitte die Zahl eingeben"); myList[i] = int.Parse(Console.ReadLine()); Console.WriteLine("Element {0} is \"{1}\"", i , myList[i]); |
Also i ist ja in diesem Fall dann wohl Item.
wenn ich myList[i = 0] = int.Parse(Console.ReadLine()); sage dann ist die Ausgabe:
Element 0 is "2"
nur das soll ja nicht sinn der Sache sein.
da liegt mein Problem.
Kha - Di 03.11.09 17:57
gage hat folgendes geschrieben : |
Muss ich eine neue variable wie int Index oder so etwas deklarieren? |
Exakt :D . Denn du willst den eingelesenen Wert ja nicht in deinem Array speichern, also brauchst du eine neue int-Variable.
gage - Di 03.11.09 18:26
Kha hat folgendes geschrieben : |
gage hat folgendes geschrieben : | Muss ich eine neue variable wie int Index oder so etwas deklarieren? | Exakt :D . Denn du willst den eingelesenen Wert ja nicht in deinem Array speichern, also brauchst du eine neue int-Variable. |
dann muss ich noch diesen Code verändern:
myList[index] = int.Parse(Console.ReadLine());
weil so schreibe ich immer neue Werte dazu aber lese ja nichts aus. kann mir da jemand mal sagen wie das in C# Quellcode dann aussehen muss?
JüTho - Di 03.11.09 19:04
Tut mir leid, mir wird immer weniger klar, was du eigentlich machen willst. Die Überschrift spricht von "Ausgeben", aber du hängst doch am Einlesen. Bitte formulier doch mal mit normaler Sprache, was du einlesen willst (Zahl, Text oder was sonst) und an welcher Stelle (erste, letzte, spezielle, nächste freie?) das in der ArrayList in welcher Form eingetragen werden soll. Danke! Jürgen
gage - Mi 04.11.09 10:33
JüTho hat folgendes geschrieben : |
Tut mir leid, mir wird immer weniger klar, was du eigentlich machen willst. Die Überschrift spricht von "Ausgeben", aber du hängst doch am Einlesen. Bitte formulier doch mal mit normaler Sprache, was du einlesen willst (Zahl, Text oder was sonst) und an welcher Stelle (erste, letzte, spezielle, nächste freie?) das in der ArrayList in welcher Form eingetragen werden soll. Danke! Jürgen |
Ich Möchte an der Stelle einen Bestimmten Wert suchen. Gehe durch die Liste und Suche nach "Hallo". Wenn "Hallo" gefunden wurde Ausgeben.
Code ohne C#:
Auf die Console schreiben(Bitte geben Sie einen WERT ein:)#
eingabe:
Wert Suchen und Wieder ausgeben!
Ausgabe: der Wert wurde gefunden!
Ausgabe: Ihr gesuchter Wert ist der Folgende!
JüTho - Mi 04.11.09 12:52
Zitat: |
Auf die Console schreiben(Bitte geben Sie einen WERT ein:)# |
Das kannst du offensichtlich, dazu brauche ich nichts zu schreiben.
Hier fehlt, dass
ReadLine einen
Rückgabewert hat, der benutzt werden soll. In deinen früheren Beiträgen hast du ihn einem Element der Liste zugewiesen, aber wozu und warum ausgerechnet an Position i (wobei i auch noch größer als das Maximum ist)? Außerdem fehlt mir der Hinweis, von welchem
Typ das sein soll. Weise den Rückgabewert doch einfach einer
string-Variablen toLookFor oder so zu und arbeite damit weiter.
Du willst wissen, ob der Wert in der Liste enthalten ist? Dazu gibt es deinen Weg:
Zitat: |
Gehe durch die Liste und Suche nach "Hallo". |
Der erste Teil formuliert eine Schleife, aber die hast du dafür bisher nicht benutzt; der zweite Teil muss eigentlich "vergleiche" heißen, d.h. "ist das aktuelle Element gleich 'Hallo'. Wo machst du das?
Es gibt aber genau für "Suche in einer Liste" eine einfache Variante sowohl für die Sch...-ArrayList als auch für List<T>. In der
SDK-Doku/MSDN bzw. über
Hilfe>Index findet man eine Methode mit dieser Beschreibung:
MSDN hat folgendes geschrieben: |
Sucht nach dem angegebenen Objekt und gibt den nullbasierten Index des ersten Vorkommens innerhalb der gesamten List zurück. |
Zitat: |
Ausgabe: der Wert wurde gefunden!
Ausgabe: Ihr gesuchter Wert ist der Folgende! |
Wozu das denn? Der eingegebene Wert ist doch identisch mit dem gesuchten und ggf. gefundenen. Eine vernünftige Antwort (= Ausgabe) kann doch nur sein:
Quelltext
1: 2: 3: 4:
| if (Eingabewert vorhanden) Ausgabe "Treffer an Position x" else Ausgabe "Eingabewert nicht gefunden" |
Mir kommt es so vor, als wenn du viel zu kompliziert denkst. Auch wenn NET strikt nach OOP geht, ist eine einzelne Maßnahme dennoch Schritt für Schritt zu erledigen; also kannst du auch so denken und planen: zuerst ..., dann ..., wenn ... dann ... andernfalls.
Jürgen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!