Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C# List ongelma

pelammin [05.04.2011 20:42:02]

#

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.

pelammin [05.04.2011 23:52:54]

#

Huomasin että kyl tossa tiedostonkin lukemissa jotain häikkää on. Poistin sanoja tiedostosta ja nyt se uikuttaa jostakin. Jatkan huomenna.

Metabolix [05.04.2011 23:57:18]

#

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();

groovyb [06.04.2011 10:54:25]

#

tulostukseen käyttäisin foreachia

foreach(Sana _Sana in sanat)
{
_Sana.tulosta();
}

Muista myös sulkea streamit.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta