Hei. Löytyisikö C# osaajia ?
Olen aloittanut C#:n opiskelut muutama viikko sitten Ennestään pitkä kokemus C++ ja C-kielistä
Eli harjoittelen tiedostosta lukemista ja listojen käyttöä Teen huvikseni sanakirjaohjelmaa ja ohjelmaa joka kyselee käyttäjältä sanoja. Listan toiminnassa on jotain hämärää.
Eli luon Sana- luokan. Jossa on string suomi ja string vierasKieli.
Luen tiedostosta rivi kerrallaan sanat listaan( käytän '|' merkkiä erotttimena ) Toimii tähän asti. Sitten tallennan Sanat listaan.
Kun yritän tulostaa listan sisällön for-lauseella. Lista tulostaa vain viimeisen rivin. Tietäisikö joku mistä mättää? Olisin oikein kiitollinen. Lähdekoodi ohessa.
List<Sana> sanat = new List<Sana>(); string tiedostonNimi = "C:\\sanat\\sanat.txt"; FileStream f = File.OpenRead(tiedostonNimi); StreamReader sReader = new StreamReader(f); string rivi = null; while ((rivi = sReader.ReadLine()) != null)//jos löytyy tyhjä rivi lopetetaan { //rivi muodossa esim. job|työ rivi = sReader.ReadLine(); rivi.ToLower();// rivi pieneksi kirjaimiksi int erotin = rivi.IndexOf('|'); //etsitään |-merkkin paikka s.vierasKieli = rivi.Substring(0, erotin); s.suomi = rivi.Substring(erotin); s.tulosta(); // tulostaa ihan oikein sanat.Add(s);// lisää Sana tyyppisen olion listaan onko vika tässä ???? } for (int i = 0; i < sanat.Count(); i++) { Sana apu = new Sana(); apu = sanat[i];// tai tässä ?? apu.tulosta(); // tulostaa vain viideisen rivin } } class Sana { public string suomi; public string vierasKieli ; public void tulosta()// tosi riisuttu malli metodista { Console.WriteLine(vierasKieli); Console.WriteLine(suomi); } }
Mod. lisäsi kooditagit.
Huomasin että kyl tossa tiedostonkin lukemissa jotain häikkää on. Poistin sanoja tiedostosta ja nyt se uikuttaa jostakin. Jatkan huomenna.
Vika on ensimmäisessä silmukassa. Lisäät listaan joka kerta saman Sana-olion, kun sinun pitäisi luoda joka kierroksella uusi Sana-olio.
C#:ssa ohjelma sisältää vain sen verran olioita, kuin new-riveillä luodaan. Oliomuuttujan sijoittaminen toiseen ei luo uutta oliota, vaan sen jälkeen molemmat muuttujat liittyvät samaan olioon:
Sana a = new Sana(); Sana b = a; a.suomi = "kokeilu"; Console.WriteLine(b.suomi); // b on sama kuin a, joten b.suomi on "kokeilu".
Sen sijaan tulostusvaiheessa oliota ei tarvitse luoda, koska haet olion listasta. Et edes tarvitse toista muuttujaa, vaan voit tulostaa sanan suoraan listasta.
sanat[i].tulosta();
Koodissa tämä rivi on turha, koska olet jo edellisellä rivillä (while-silmukan ehdossa) lukenut rivin tiedostosta:
rivi = sReader.ReadLine();
Myös muuttaminen pieniksi kirjaimiksi on väärin:
// Tämä luo uuden tekstin mutta unohtaa sen heti: rivi.ToLower(); // Tämä luo uuden tekstin ja sijoittaa sen vanhan tilalle: rivi = rivi.ToLower();
tulostukseen käyttäisin foreachia
foreach(Sana _Sana in sanat) { _Sana.tulosta(); }
Muista myös sulkea streamit.
Aihe on jo aika vanha, joten et voi enää vastata siihen.