C# | Liste.Add(ListeCache[Zufall]); | -> Laufzeitfehler

Palladin007

assimiliert
Code:
            int Zufall;
            while (true)
            {
                List<string> neueListe = new List<string>();
                string[] Array = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
                foreach (string z in neueListe)
                {
                    neueListe.Add(z);
                }

                Random Rnd = new Random();
                Zufall = Rnd.Next(0, 3);
                Console.WriteLine(neueListe[Zufall]);
                Console.ReadLine();
            }

Das ist ein kleines Test-Progrämmchen, um einen logischen Fehler im großen Programm zu finden.

Das hat die Aufgabe, unter den Einträgen der Liste immer eins auszuwählen und anzuzeigen.

Aber das tut es nicht, es kommt folgender Laufzeitfehler (heißt das so?)

Code:
ArgumentOutOfRangeException wurde nicht behandelt.

Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.

Dass es in der Liste ein Zeichen an der Stelle gibt, lässt sich ja ganz einfach raus finden:

Man fügt diese Zeile ein:
Code:
Console.WriteLine(Zufall);
Und schaut dann selber nach, ob das Zeichen an der Stelle vorhanden ist.

Wenn ich das mache, bekomme ich z.B. 1 heraus, das ist vorhanden, der Fehler ist aber immer noch da.




Wo liegt der Fehler?
Ich verstehe es nicht :(
 
Zuletzt bearbeitet:
Habe den oberen Fehler mittlerweile eben gefunden und versucht, das dann im eigentlichen Fehler zu auch so zu verwenden, bringt dann aber nur einen Syntax-Fehler:

Code:
        public static List<string> Mix(List<string> ListeCache)
        {
            List<string> Liste = new List<string>();
            Random Rnd = new Random();

            for (int i = ListeCache.Count; i >= 0; i = i - 1)
            {
                Zufall = Rnd.Next(0, ListeCache.Count);
                Liste.Add(ListeCache[Zufall]);
                ...
            }
            ...
        }
Der Rest ist unwichtig.
Es geht nur um die letzte Zeile, denn dort wird der selbe Laufzeitfehler angezeigt, wie der oben.

Ich habe das dann mal testweise auch so versucht:

Code:
Liste.Add("{o}",Zufall);

Aber das kann ja logischer weise nicht gehen, da dann ja zwei Parameter übergeben werden, was ich ja nicht will.


Weiß jemand, wo das Problem liegt?
 
Zuletzt bearbeitet:
Auch wenns mich nicht interessiert: Und wie?

ot:
Könnte unter Umständen für andere interessant sein :D:)
 
Wir werden es vermutlich nie erfahren...

Ich hoffe auf jeden Fall, daß ich nicht in dem Flugzeug sitze, dessen Schubregelung er gerade schreibt :)
 
Hm, soweit ich mich noch erinnern kann, sollte das ganze Programm Listen vermischen.
Meine Idee war nicht die beste, dieser Youtuber: Dragonmaster047 (noch recht klein, macht aber super Tutorials)
Er hat mir ein Programm geschrieben. Ich weiß nicht mehr wo, aber er hat auch in seine Tutorial-Reihe aufgenommen.

Auf jeden Fall habe ich das übernommen und mit ein paar weiteren Methoden für eine dlll geeignet umgebaut und erweitert. Außerdem arbeitet es jetzt nicht mehr mit Listen, sondern mit Feldern, was das ganze schneller macht.



Hier ist die eigentliche Methode:
Code:
        public static T[] Randomize<T>(T[] randomArray)
        {
            Random random = new Random();

            int[] iArrayPosition = new int[randomArray.Length];

            for (int i = 0; i < iArrayPosition.Length; i++)
            {
                iArrayPosition[i] = -1;
            }

            int randomNumber;

            for (int i = 0; i < iArrayPosition.Length; i++)
            {
                randomNumber = random.Next(0, iArrayPosition.Length - 1);

                while (iArrayPosition[randomNumber] != -1)
                {
                    randomNumber++;
                    if (randomNumber >= iArrayPosition.Length)
                        randomNumber = 0;
                }

                iArrayPosition[randomNumber] = i;
            }

            T[] returnArray = new T[randomArray.Length];

            for (int i = 0; i < iArrayPosition.Length; i++)
            {
                returnArray[i] = randomArray[iArrayPosition[i]];
            }

            return returnArray;
        }

Die anderen Methoden, die ich noch dazu geschrieben haben, sind nur dafür da, dass eine eingegebene Liste auch verarbeitet werden kann. Eine Liste wird dann einfach in ein Feld umgewandelt und an die Methode oben weiter gegeben. Das Ergebnis wird dann wieder eine Liste.
Klingt umständlich, aber bei sehr großen Listen oder Feldern, wird man merken, dass Listen langsamer sind, als Felder.

Und dazu hab ich noch eingebaut, dass das ganze keine Observer-Methode ist, sondern das Ergebnis über out zurück gibt.
Ist an sich nur eine Zeile, aber so hab ich etwas mehr Freiheit rein gebracht.

Für Programme, wenn ich die DLL nicht einbinde, verwende ich aber nur die oben gepostete Methode.



PS: Sorry, dass ich erst jetzt da schreibe, habs einfach vergessen^^
 
Zuletzt bearbeitet:
Oben