[c#] String uit bestand die één keer mag voorkomen

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • OB1
  • Registratie: April 2014
  • Laatst online: 08-10 17:14
Ik ben bezig met een programma in C#. Een onderdeel hiervan is is dat er een aantal labels op mijn form gevuld worden met een random woord uit een array. De array in kwestie is words.

Ik wil echter niet dat hetzelfde woord meerdere keren wordt weergegeven. Per label waar een woord in moet worden gezet moet het volgende worden gedaan:
1. Woord bepalen (dit is string word) - dit gaat goed
2. Alle labels die van toepassing zijn (die Word in de naam hebben) moet nagekeken worden (elk label nagaan)
-> Komt de string uit de array overeen met de string in het label, dan moet er een nieuw woord gekozen worden (dus methode opnieuw, toch?)
-> Komt de string uit de array niet overeen met de string in het label (als 'ie leeg is of opnieuw hier aankomt), dan moet die string in het label gezet worden

Het probleem is nu echter dat ik toch hetzelfde woord twee keer te zien kan krijgen en dit komt ook voor. Wat doe ik fout?

C#:
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
33
34
35
36
37
private void FillWords()
        {
            r = new Random();
            words = File.ReadAllLines(Application.StartupPath + @"\words.txt");
            foreach (Control c in Controls)
            {
                if (c is Label && c.Name.Contains("Word"))
                {
                    c.Text = GetWord();
                }
            }
        }

private string GetWord()
        {
            int index = r.Next(words.Length);
            string word = words[index];
            foreach (Control control in this.Controls) //elk label nagaan
            {
                if (control is Label)
                {
                    if (control.Name.Contains("Word") && control.Text == word) //komt het woord voor (niet goed)
                    {
                        word = GetWord(); //opnieuw methode uitvoeren (nieuw woord halen)
                    }
                    if (control.Name.Contains("Word") && control.Text != word) //komt het woord niet voor (is goed)
                    {
                        //niks
                    }
                }
                else
                {
                    break; //uit de foreach loop gaan
                }
            }
            return word; //is klaar
        }


**edit**
Het else statement onderaan moet weg. Ik weet niet waarom ik dit nog niet heb geprobeerd, maar het is dus opgelost. TR is aangemaakt ;)

AMD 2700x @ 4.15 GHz | Vega 56 (Vega 64 BIOS) | 32 GB DDR4 | MSI X470 Gaming Plus | Intel 600P 1TB | Corsair RM550X

Beste antwoord (via OB1 op 04-02-2018 21:07)


  • storeman
  • Registratie: April 2004
  • Laatst online: 06:45
Ik denk dat die "else { break; }" je probleem is. Zodra je een ander element dan een label tegenkomt, geef je het random woord terug die niet tegen alle elementen is gecheckt.

Ik neem aan dat je alle labels in je form opnieuw invult. Je zou ook kunnen kijken naar een array.splice functie (geen idee hoe dat in C# werkt, maar er zal iets vergelijkbaars zijn). Zo kun je steeds een random waarde uit je array met woorden halen en weet je zeker dat je unieke woorden op je form hebt (mits je words.txt geen dubbele values bevat). Ik denk dat je code dan een stuk korter kan.

In PHP zou ik zoiets doen:

PHP:
1
2
3
4
$words = // get word from file as array;

// Pick one random item form array, remove it from the array and put it in $randomWord
$randomWord = array_splice($words, rand(0, count($words)-1), 1);

[ Voor 17% gewijzigd door storeman op 04-02-2018 21:12 ]

"Chaos kan niet uit de hand lopen"

Alle reacties


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 06:45
Ik denk dat die "else { break; }" je probleem is. Zodra je een ander element dan een label tegenkomt, geef je het random woord terug die niet tegen alle elementen is gecheckt.

Ik neem aan dat je alle labels in je form opnieuw invult. Je zou ook kunnen kijken naar een array.splice functie (geen idee hoe dat in C# werkt, maar er zal iets vergelijkbaars zijn). Zo kun je steeds een random waarde uit je array met woorden halen en weet je zeker dat je unieke woorden op je form hebt (mits je words.txt geen dubbele values bevat). Ik denk dat je code dan een stuk korter kan.

In PHP zou ik zoiets doen:

PHP:
1
2
3
4
$words = // get word from file as array;

// Pick one random item form array, remove it from the array and put it in $randomWord
$randomWord = array_splice($words, rand(0, count($words)-1), 1);

[ Voor 17% gewijzigd door storeman op 04-02-2018 21:12 ]

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • OB1
  • Registratie: April 2014
  • Laatst online: 08-10 17:14
storeman schreef op zondag 4 februari 2018 @ 21:07:
Ik denk dat die "else { break; }" je probleem is. Zodra je een ander element dan een label tegenkomt, geef je het random woord terug die niet tegen alle elementen is gecheckt.

Ik neem aan dat je alle labels in je form opnieuw invult. Je zou ook kunnen kijken naar een array.splice functie (geen idee hoe dat in C# werkt, maar er zal iets vergelijkbaars zijn). Zo kun je steeds een random waarde uit je array met woorden halen en weet je zeker dat je unieke woorden op je form hebt (mits je words.txt geen dubbele values bevat). Ik denk dat je code dan een stuk korter kan.
De else { break; } was inderdaad het probleem. Thanks voor je hulp! :)

AMD 2700x @ 4.15 GHz | Vega 56 (Vega 64 BIOS) | 32 GB DDR4 | MSI X470 Gaming Plus | Intel 600P 1TB | Corsair RM550X