Autor Beitrag
gage
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 03.11.09 15:11 
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.

ausblenden volle Höhe 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; Console.WriteLine("Array Index [{0}]: {1}", i, myList[i].ToString()));
            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:

ausblenden C#-Quelltext
1:
2:
3:
4:
// Assigning a value to the property changes the value of
        // the indexed element.
        stringList[2] = "abcd";
        Console.WriteLine("Element {0} is \"{1}\""2, stringList[2]);

Gruß
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 03.11.09 15:29 
user profile icongage hat folgendes geschrieben Zum zitierten Posting springen:
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.)
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 03.11.09 17:10 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 03.11.09 17:44 
user profile iconNemag hat folgendes geschrieben Zum zitierten Posting springen:
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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 03.11.09 17:57 
user profile icongage hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Di 03.11.09 18:26 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongage hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Mi 04.11.09 10:33 
user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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.

Zitat:
eingabe:

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.

Zitat:
Wert Suchen und

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:
ausblenden 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