Array Linq Query

  • C#
  • .NET (FX) 3.0–3.5

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    Array Linq Query

    Hey,

    Ich bräuchte mal Hilfe mt ner kleinen Linq query.
    Und zwar hab ich n int array.
    Nun mochte ich einen random index aus dem array haben, der muss allerdings null sein, darf also noch keinen wert zugewiesen haben.

    Wie mache ich das am besten?
    C# Developer
    Learning C++
    Moin,

    null geht nicht, denn Wertetypen können keinen null-Wert annehmen, außer sie sind als Nullable mit einem Fragezeichen markiert.
    Meinst Du den Standardwert (0)?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Achso, so meinst Du das.
    Das ist kein Problem, Dann setze halt als Maximum beim Random die Länge des Arrays (-1, weil Indizes 0-basiert sind):

    C#-Quellcode

    1. var rnd = new Random();
    2. var arrayWert = deinArray[rnd.Next(0, deinArray.Length - 1)];


    Das kann sich allerdings wiederholen ;)!

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Entferne einfach das Element aus dem Array.
    Wobei ich gerade sehe, dass Du es ja eig. anders willst, oder? Also dass der Index auf ein nicht existierendes Element zeigt. Aber das macht eig. wenig Sinn, oder?

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ehm ne. Also guck:
    Ich hab n simples array :

    int[] testarr = new int[amount];

    Jetzt sind ja erstmal alle Plätze "0".

    In ner Schleife muss ich mir jedes mal n zufälligen Platz im array rauspicken der dann n wert zugewiesen bekommt.

    Allerdings darf in diesem "zufälligen Platz" nicht bereits ein wert stehen und er darf auch vorher noch nicht verwendet worden sein ;o was ja quasi das selbe ist da er ja nach dem in n random index raussuche n wert zuweise.
    C# Developer
    Learning C++
    Achso, dann erstelle Dir doch eine List<int> und speichere darin die verwendeten Indizes. Da Du das in der Schleife machst, brauchst Du LINQ dann nur bei der Abfrage:

    C#-Quellcode

    1. var indexList = new List<int>();
    2. for ...
    3. {
    4. var rnd = new Random();
    5. int randomIndex = rnd.Next(0, deinArray.Length - 1);
    6. while (indexList.Any(item => item == randomIndex))
    7. {
    8. randomIndex = rnd.Next(0, deinArray.Length - 1);
    9. }
    10. var arrayWert = deinArray[randomIndex];
    11. indexList.Add(randomIndex);
    12. // Deine Aktion
    13. }


    Vorsicht: Überlege Dir noch, wie Du das dann beendest, sonst endet das nach einer Weile in einer Endlosschleife.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    Array linear füllen und mit Shuffle durchmischen.
    dotnetperls.com/shuffle

    Irgendwann habe ich auch mal die Linq-Schnellvariante gesehen, allerdings nie getestet:

    C#-Quellcode

    1. Random rnd=new Random();
    2. string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();
    Finde ich relativ elegant.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @Trade :

    C#-Quellcode

    1. int randomIndex = rnd.Next(0, deinArray.Length - 1);
    2. while (indexList.Any(item => item == randomIndex))
    3. {
    4. randomIndex = rnd.Next(0, deinArray.Length - 1);
    5. }

    ==

    C#-Quellcode

    1. do
    2. {
    3. randomIndex = rnd.Next(0, deinArray.Length - 1);
    4. } while (indexList.Any(item => item == randomIndex))

    ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    @ThePlexian Ah, stimmt, dachte mir doch, das muss besser gehen, danke. :)
    Gäbe sowieso sogar eine Lösung ohne Liste, insofern 0 nach dem Herausnehmen nicht mehr vorkommt, indem man einfach mit Where ein IEnumerable<int> erstellt, in dem die Items nur den Wert 0 haben und damit arbeitet. Da kämen dann keine Einträge mehrmals vor.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: