Hei!
Osaatteko neuvoa, miten listasta saa arvottua string-tyyppisiä elementtejä? Mulla on ListItem, johon haen tietokannasta nimet, ja tuon listan sisällöstä olis sit tarkotus arpoa nimi tekstikenttään napinpainalluksella. Kielenä C#.
ListItem item = new ListItem(); item.Text = reader["Nimet"].ToString(); Random rnd = new Random(); //muuttuja johon arvotaan int n = rnd.Next(Convert.ToInt32(item.Text)); TextBox1.Text = n.ToString();
Nappia painettaes tulee kuitenki virheilmoitus selaimeen "Syötemerkkijonon muoto ei ollut kelvollinen." joka viittaa tuohon int n -riviin.
Voisiko joku neuvoa mitä pitää tehdä toisin, oon aika avuton tämän arpomishomman kanssa.. -.-
Kiitos!!
Moi Keanna!
rakentele oheisen esimekin pohjalta...
//esimerkki väännetty SharpDevevelop 4.0:lla using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace RandomTesti { public partial class MainForm : Form { List<string> lst = new List<string>(); Random rnd = new Random(); //... void MainFormLoad(object sender, EventArgs e) { for(int i=1;i<=10;i++) { lst.Add("Nimi" + i.ToString()); } } void Button1Click(object sender, EventArgs e) { textBox1.Text = lst[rnd.Next(0, lst.Count)]; //(min, max) } } }
esim. täältä selviää miten pukata kama readerista listaan
lainaus:
Msdn: The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated.
Kun Random objekti luodaan, on hyvä asettaa muuttuva seed, esim:
Random rnd = new Random(new System.DateTime().Millisecond)
Kiitos tuhannesti! :)
Neau33, jätin tuon for-rakenteen pois ja tein listaanlisäyksen tällä tavalla:
r.Add(item.ToString());
Toimii!
groovyb kirjoitti:
lainaus:
Msdn: The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated.
Kun Random objekti luodaan, on hyvä asettaa muuttuva seed, esim:
Random rnd = new Random(new System.DateTime().Millisecond)
Itse asiassa oletusmuodostimessa näyttäisi jo olevan tällainen ominaisuus.
http://msdn.microsoft.com/en-us/library/h343ddh9.aspx
lainaus:
Initializes a new instance of the Random class, using a time-dependent default seed value.
Usein käytetty Random-luokan instanssi kannattaa tietenkin laittaa talteen, eikä luoda joka kerta uudelleen.
Kokeilin siis myös tuolla for-lauseella ja siitä tuli mieleensemmoset kysymykset vielä, että miks joidenkin nimien peräs näkyy numero, kun ne on arvottu tekstikenttään kun tarkoitus olis kuitenkin näyttää vain pelkkä nimi?
Toinen kysymys, että kun arvotun nimen koittaa tulostaa listboxiin, niin sinne tulostuu kuitenkin kaikki nimet ja useampaan kertaa ja jotkut kera numeron nimen lopussa. Mistä tämä voisi johtua? Lisäys tapahtuu näin:
ListBox1.Items.Add(r[index]);
Kai muistit tyhjentää listan aina ennenkuin arvot uuden kerran?
Ja jos tosiaan käytät luokan alussa luotua randomia, seed ei muutu. Eli ennen jokaista arpomiskierrosta jona täytät listan tulisi objekti luoda uudestaan. Jos mukana tulee numeroita listaan, collectionisi sisältää myös tekstiä numeroilla. Tarkasta listasi sisältö.
Huomaa että tuossa esimerkissä arvotaan loopilla, eli pitääkin tulla enemmän kuin yksi tulos koska n kertaa arvotaan ja lisätään. Ja koska arvotaan, voi sama tulos tulla kaksi kertaa ellet tarkasta onko arvottu tulos jo listassa.
Joo tuon tyhjäyshomman hoksasin tehdä. Ja noita numeroita ei tuu, jos en käytä sitä for-lausetta. Jäi vaan ihmetyttämään..
No vielä yksi kysymys tietyn määrän arpomisesta. Kun siis haen listaan kaikki nimet (22 kpl) tietokannasta, niin tuosta joukosta pitäis arpoa 7 nimeä listboxiin ja koitin tehdä tämän do-while rakenteella näin:
do { int index; Random rnd = new Random(); index = rnd.Next(0, r.Count); //(min, max) ListBox1.Items.Add(r[index]); } while (ListBox1.Items.Count <8);
Mutta sinne tulostuu tästä huolimatta yli 7 itemiä.. en oo siis nyt käyttäny sitä for-lausettakaan ettei siitä ainakaan johdu. :S
Niin, no tuossahan arvot aivan yksiselitteisesti 8 kohtaa. Koodissasi lukee "while (count < 8)", suomeksi "niin kauan, kuin kohtia on alle 8".
Kokeilin myös (count == 7), mutta silläkin tuli enemmän kuin olisi tarkoitus. o.O
No tietenkin tulee sama määrä, koska (count == 7) ja (count < 8) ovat sama asia.
Ota vaikka kynä ja paperia, tai laske ihan sormin kierros kierrokselta että miten monta kierrosta tuo looppi pyörii. Ei pitäisi olla ylivoimainen tehtävä.
Jos jo looppiin mennessä tiedät että tarvitset aina 7 itemia, niin miksi et käytä for-looppia? Tietenkin sen voi tehdä do-while-loopillakin, mutta mielestäni for olisi aavistuksen loogisempi.
makumaku kirjoitti:
No tietenkin tulee sama määrä, koska (count == 7) ja (count < 8) ovat sama asia.
No ei kyllä pitäisi olla. Toki kokonaisluvuille <= 7 ja < 8 ovat sama asia, mutta ei == 7 ja < 8.
Joo sorry, copy-pastesin näköjään ilman tarkempaa katsomista ja miettimistä. Siis tosiaan siinä olikin == -vertailu, eikä <=
Mitä jos nyt palaisit alkeisiin ja tekisit ensin silmukan, joka tulostaa kokonaisluvut 1–7? Sitten voit laittaa kyseiseen silmukkaan luvun tulostamisen tilalle tuon listan kohdan lisäämisen, niin kohtia tulee oikea määrä.
Kiittistä vaan! For-lauseellahan se lähtikin pelittään. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.