Liste zufällig anordnen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von mrMo.

    Liste zufällig anordnen

    Hallo,

    ich habe eine list of object, die ich zufällig anordnen möchte.

    Vorbild sind dabei die vb-Zeilen:

    VB.NET-Quellcode

    1. Dim OriginalList = {0,1,2,3,4,5,6,7}
    2. Dim rnd = New Random()
    3. Dim RandomizedList = OriginalList.OrderBy(Function(x) rnd.Next()).ToList


    der übersetzer gibt mir folgendes raus:

    C#-Quellcode

    1. var OriginalList = new[] { 0, 1, 2, 3, 4, 5, 6, 7 };
    2. var rnd = new Random();
    3. var RandomizedList = OriginalList.OrderBy(x => rnd.Next()).ToList();


    ich baue es so ein, jedoch kann ich unter dem Event pictureBox1_Click nicht auf RandomizedList zugreifen. Wie könnte ich dies lösen? LG

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. static List<object> _pictureliste = new List<object>();
    4. static List<bool> _Isaufgedeckt = new List<bool>();
    5. public Form1()
    6. {
    7. InitializeComponent();
    8. _pictureliste.Add(Properties.Resources.hund);
    9. _pictureliste.Add(Properties.Resources.apfel);
    10. _pictureliste.Add(Properties.Resources.clown);
    11. var rnd = new Random();
    12. var RandomizedList = _pictureliste.OrderBy(x => rnd.Next()).ToList();
    13. }
    14. private void pictureBox1_Click(object sender, EventArgs e)
    15. {
    16. pictureBox1.Image =
    17. }
    18. }



    Du musst dich mal mit der Sichtbarkeit von Variablen beschäftigen. Wo muss man was deklarieren um von A, B, C darauf zugreifen zu können.

    Innerhalb einer Klasse, Methode, Schleife, IF Prüfung, ... das sind Unterschiede und vor allem Grundlagen die man aus dem FF wissen muss.

    in deinem Fall ist wohl die Klassenweite Deklaration die Lösung.

    Edit: 500 Postings und dann so ne Anfänger Frage? ;(
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Visual_Prog schrieb:

    jedoch kann ich unter dem Event pictureBox1_Click nicht auf RandomizedList zugreifen.
    ja, so ist das mit lokalen Variablen - ja mit Variablen überhaupt: Jede Variable ist nur in ihrem Gültigkeitsbereich (alias "Scope") zugreifbar.
    Guck deinen c#-code an: RandomizedList ist eine lokale Variable in der Methode Form1().
    Ausserhalb davon logischerweise nicht zugreifbar.
    Nun überleg mal: Warum ist zB _pictureliste durchaus zugreifbar - was ist der Unterschied zwischen beiden?
    @mrMo bin noch ganz neu in C#, ist zwar keine Entschuldigung aber naja ^^
    @ErfinderDesRades

    Habe das jetzt so umgeschrieben und es scheint zu funktionieren.

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. static List<object> _pictureliste = new List<object>();
    4. static List<bool> _Isaufgedeckt = new List<bool>();
    5. static Random rnd = new Random();
    6. List<object> RandomizedList = _pictureliste.OrderBy(x => rnd.Next()).ToList();
    7. public Form1()
    8. {
    9. InitializeComponent();
    10. _pictureliste.Add(Properties.Resources.hund);
    11. _pictureliste.Add(Properties.Resources.apfel);
    12. _pictureliste.Add(Properties.Resources.clown);
    13. }
    14. private void pictureBox1_Click(object sender, EventArgs e)
    15. {
    16. pictureBox1.Image = RandomizedList[0];
    17. }
    18. }



    Neue Frage: wie kann ich der Picturebox den ersten Index der Randomizedlist zuweisen?
    Fehler(Zeile 21):
    Fehler 1 Der Typ 'object' kann nicht implizit in 'System.Drawing.Image' konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
    Wie würde hier eine sinnvolle Umwandlung aussehen?
    Nun, die _picturelist ist eben ne List<object>. Stellt sich nur die Frage, warum Du Dich dafür entschieden hast. Denn mit nem besseren Typ als object ginge die Zuweisung an pictureBox1.Image sehr leicht. Welcher Typ das ist, solltest Du selber rausfinden können.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Visual_Prog schrieb:

    @mrMo bin noch ganz neu in C#, ist zwar keine Entschuldigung aber naja ^^
    Und wo ist hier der Unterschied zu VB.Net?

    tipp für das neue „Problem“:
    Wenn Picturebox.Image den Datentypen Image hat, dann weise auch diesen Datentypen zu. Ggf. Hilft das Casten/Parsen des Datentypen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    ahh danke, habe jetzte alle list of object durch list of system.drawing.image umgetauscht.

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. static List<System.Drawing.Image> _pictureliste = new List<System.Drawing.Image>();
    4. static List<bool> _Isaufgedeckt = new List<bool>();
    5. static Random rnd = new Random();
    6. List<System.Drawing.Image> RandomizedList = _pictureliste.OrderBy(x => rnd.Next()).ToList();
    7. public Form1()
    8. {
    9. InitializeComponent();
    10. _pictureliste.Add(Properties.Resources.hund);
    11. _pictureliste.Add(Properties.Resources.apfel);
    12. _pictureliste.Add(Properties.Resources.clown);
    13. }
    14. private void pictureBox1_Click(object sender, EventArgs e)
    15. {
    16. pictureBox1.Image = RandomizedList[0];
    17. }
    18. }



    was auch schon klappt ist pictureBox1.Image = _pictureliste[0];

    jedoch nicht pictureBox1.Image = RandomizedList[0]; es besteht eine System.ArgumentOutOfRangeException, ich gehe davon aus, die randomizedlist ist immer noch leer dann ;/ ?
    Naja, Zeile#6 wird zuerst aufgerufen, die Z#12-14 später. Dementsprechend solltest Du wohl die Reihenfolge ändern, indem Du in Z#6 die RandomizedList nur deklarierst, aber inhaltlich erst nach Z#14 befüllst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Beschäftige dich mal mit den Basics. Ohne die, wirds schwer...
    VB.Net und C# sind im übrigen relativ identisch an vielen Stellen. Wobei C# weniger dirty ist, da Option Strict On off dort nicht existiert
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen