Problem med lista/sökfunktion c#

Trädvy Permalänk
Medlem
Registrerad
Maj 2017

Problem med lista/sökfunktion c#

Hej, jag går programmering 1 och är alltså¨helt ny till detta. Som projekt ska vi skapa en loggBok där vi ska kunna spara, skriva ut och söka på inlägg som är sparade i en lista. Varje inlägg är dock en array.
Jag har försökt söka runt på exempel men hittar ingenting som fungerar!
När man skrivit tex två inlägg och vill skriva ut dem på skärmen så skrivs det senaste inlägget ut två gånger.
Och när man ska söka på inlägg så är bara det senaste sökbart, och även det skrivs då ut så många gånger som det finns inlägg i loggboken..
Någon som har något tips kring detta?

namespace ConsoleApp4 { class Program { //START PÅ PROGRAM static void Main(string[] args) { //LOGGBOKEN// List<string[]> loggBok = new List<string[]> { };//Skapar listan loggBok som sparar variabler av typen string-vektorer string[] post = new string[3]; string keyword = "";//Variabel för sökfunktion DateTime time = DateTime.Now;//Hämtar datum och tid från användarens dator Console.WriteLine("\t" + time);//Och skriver ut det när man startar programmet //Välkomsthälsning Console.WriteLine("\n\tVälkommen till Loggboken!"); //Bool och While bool runningBool = true;//Bool=true för att loppen ska köras tills användaren trycker 4 while (runningBool) //Whileloop start { //Ber användaren göra ett val Console.WriteLine("\n\tVad vill du göra? Välj ur menyn: "); //MENY Console.WriteLine("\n\t[1]Skriva ett nytt inlägg"); Console.WriteLine("\t[2]Söka ett inlägg"); Console.WriteLine("\t[3]Skriva ut alla inlägg"); Console.WriteLine("\t[4]Avsluta Loggboken"); int option;//initierar variabeln som används i switch-satsen, sparar användarens menyval Int32.TryParse(Console.ReadLine(), out option);//Undantagshantering TryParse switch (option) //Switch-sats för användarens menyval { case 1: //sparar titeln i index 0 i vektorn "post" Console.Write("\tAnge vad vill du kalla ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 time = DateTime.Now;//hämtar tid och datum just nu string thisMoment = Convert.ToString(time);//skapar en stringvariabel att kunna spara konverterad tid i post[2] = thisMoment;//sparar tiden för skapat inlägg loggBok.Add(post);//sparar inlägget i loggboken Console.WriteLine("Ditt inlägg är nu sparat!");//och skriver ut att det är gjort break; case 2: Console.Write("Skriv in en titel för att söka efter ett inlägg: "); keyword = Console.ReadLine(); //linq? var entries = loggBok.Where(entry => entry.Contains(keyword)); foreach (var entry in entries) { foreach (string s in entry) Console.WriteLine(s); } if (entries.Count() == 0) { Console.WriteLine("Inlägget du sökte kunde inte hittas"); } //Samma(senaste) inlägg skrivs ut två gånger break; case 3: Console.WriteLine("\tHär är alla inlägg du har skrivit: "); //Foreach loop foreach (var item in loggBok) { foreach (var s in item) Console.WriteLine(s); } //skriver bara ut senaste inlägget, två gånger... break; case 4: runningBool = false; break; default: Console.WriteLine("Nu skrev du något knasigt.. prova igen!\n"); break; } } //Metod här } } }

la till code-taggar //mod
Trädvy Permalänk
Medlem
Registrerad
Maj 2017

Såg att koden la sig helt fel, hoppas det går att läsa ändå!

Trädvy Permalänk
Medlem
Registrerad
Jun 2003

Du sparat alltid meddelandet på samma plats i arrayen. Glöm inte att indentera din kod

namespace ConsoleApp4 { class Program { //START PÅ PROGRAM static void Main(string[] args) { //LOGGBOKEN// List<string[]> loggBok = new List<string[]> { };//Skapar listan loggBok som sparar variabler av typen string-vektorer string[] post = new string[3]; string keyword = "";//Variabel för sökfunktion DateTime time = DateTime.Now;//Hämtar datum och tid från användarens dator Console.WriteLine("\t" + time);//Och skriver ut det när man startar programmet //Välkomsthälsning Console.WriteLine("\n\tVälkommen till Loggboken!"); //Bool och While bool runningBool = true;//Bool=true för att loppen ska köras tills användaren trycker 4 while (runningBool) //Whileloop start { //Ber användaren göra ett val Console.WriteLine("\n\tVad vill du göra? Välj ur menyn: "); //MENY Console.WriteLine("\n\t[1]Skriva ett nytt inlägg"); Console.WriteLine("\t[2]Söka ett inlägg"); Console.WriteLine("\t[3]Skriva ut alla inlägg"); Console.WriteLine("\t[4]Avsluta Loggboken"); int option;//initierar variabeln som används i switch-satsen, sparar användarens menyval Int32.TryParse(Console.ReadLine(), out option);//Undantagshantering TryParse switch (option) //Switch-sats för användarens menyval { case 1: //sparar titeln i index 0 i vektorn "post" Console.Write("\tAnge vad vill du kalla ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 time = DateTime.Now;//hämtar tid och datum just nu string thisMoment = Convert.ToString(time);//skapar en stringvariabel att kunna spara konverterad tid i post[2] = thisMoment;//sparar tiden för skapat inlägg loggBok.Add(post);//sparar inlägget i loggboken Console.WriteLine("Ditt inlägg är nu sparat!");//och skriver ut att det är gjort break; case 2: Console.Write("Skriv in en titel för att söka efter ett inlägg: "); keyword = Console.ReadLine(); //linq? var entries = loggBok.Where(entry => entry.Contains(keyword)); foreach (var entry in entries) { foreach (string s in entry) Console.WriteLine(s); } if (entries.Count() == 0) { Console.WriteLine("Inlägget du sökte kunde inte hittas"); } //Samma(senaste) inlägg skrivs ut två gånger break; case 3: Console.WriteLine("\tHär är alla inlägg du har skrivit: "); //Foreach loop foreach (var item in loggBok) { foreach (var s in item) Console.WriteLine(s); } //skriver bara ut senaste inlägget, två gånger... break; case 4: runningBool = false; break; default: Console.WriteLine("Nu skrev du något knasigt.. prova igen!\n"); break; } } //Metod här } } }

Signatur raderad, se reglerna för mer info.

Trädvy Permalänk
Medlem
Registrerad
Jun 2003

Signatur raderad, se reglerna för mer info.

Trädvy Permalänk
Medlem
Registrerad
Maj 2017

Förstår vad som menas att jag måste skapa plats i listan för ny array varje gång, men vet inte hur jag ska implementera detta. Exemplen på sidan känns rätt overkill när man är så ny..?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jan 2014

case 1: //sparar titeln i index 0 i vektorn "post" Console.Write("\tAnge vad vill du kalla ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 time = DateTime.Now;//hämtar tid och datum just nu string thisMoment = Convert.ToString(time);//skapar en stringvariabel att kunna spara konverterad tid i post[2] = thisMoment;//sparar tiden för skapat inlägg loggBok.Add(post);//sparar inlägget i loggboken Console.WriteLine("Ditt inlägg är nu sparat!");//och skriver ut att det är gjort break;

Problemet är att du använder samma array varje gång du lägger in den i din loggbok.

Dvs ifall du börjar med att lägga in a, 1, x sedan b, 2, y så kommer du först lägga in a, 1 och x i din logbok, när du sedan vill lägga in b, 2 och y så kommer du modifiera arrayen som redan håller i a och 1, vilket gör att dessa skrivs över, sedan lägger du in samma array gång på gång.

Lösningen är att skapa din array i case 1 för varje nytt inlägg, dvs

string[] post = new string[3]; //Skapa en ny array för varje inlägg. //sparar titeln i index 0 i vektorn "post" Console.Write("\tAnge vad vill du kalla ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 time = DateTime.Now;//hämtar tid och datum just nu string thisMoment = Convert.ToString(time);//skapar en stringvariabel att kunna spara konverterad tid i post[2] = thisMoment;//sparar tiden för skapat inlägg loggBok.Add(post);//sparar inlägget i loggboken Console.WriteLine("Ditt inlägg är nu sparat!");//och skriver ut att det är gjort break;

Edit: blev galen indentering men du förstår nog poängen.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Sep 2009

Du gör i princip såhär... (någon form av pseudokod)

posts := List<array[]>()
post := string[3]

while(true)
{
post[0] = "titel"
post[1] = "tid"
post[2] = "meddelande"
posts.Add(post)
}

variabeln post deklareras INNAN loopen.

Du kommer att lägga till SAMMA variabel varje gång du kör posts.add(post)
Du kommer att skriva över värden i post VARJE gång du skriver post[0] = "titel"...

så resultatet kommer att bli en lista som ser ut såhär [post, post, post, post, post...]
där post innehåller det senaste värdena du stoppade in i post

Vad du skall göra är att skapa en NY variabel VARJE gång i loopen

posts := List<array[]>()
while(true)
{
post := post[3]
post[0] = "titel"
post[1] = "tid"
post[2] = "meddelande"
posts.Add(post)
}

det kommer att ge dig en lista som ser ut såhär [post1, post2, post3, ..., postN]

Trädvy Permalänk
Medlem
Registrerad
Maj 2017
Skrivet av Zedong:

case 1: //sparar titeln i index 0 i vektorn "post" Console.Write("\tAnge vad vill du kalla ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 time = DateTime.Now;//hämtar tid och datum just nu string thisMoment = Convert.ToString(time);//skapar en stringvariabel att kunna spara konverterad tid i post[2] = thisMoment;//sparar tiden för skapat inlägg loggBok.Add(post);//sparar inlägget i loggboken Console.WriteLine("Ditt inlägg är nu sparat!");//och skriver ut att det är gjort break;

Problemet är att du använder samma array varje gång du lägger in den i din loggbok.

Dvs ifall du börjar med att lägga in a, 1, x sedan b, 2, y så kommer du först lägga in a, 1 och x i din logbok, när du sedan vill lägga in b, 2 och y så kommer du modifiera arrayen som redan håller i a och 1, vilket gör att dessa skrivs över, sedan lägger du in samma array gång på gång.

Lösningen är att skapa din array i case 1 för varje nytt inlägg, dvs

string[] post = new string[3]; //Skapa en ny array för varje inlägg. //sparar titeln i index 0 i vektorn "post" Console.Write("\tAnge vad vill du kalla ditt inlägg: "); post[0] = Console.ReadLine(); //sparar inlägget i index 1 Console.WriteLine("Skriv ditt inlägg:"); post[1] = Console.ReadLine(); //sparar tiden i index 2 time = DateTime.Now;//hämtar tid och datum just nu string thisMoment = Convert.ToString(time);//skapar en stringvariabel att kunna spara konverterad tid i post[2] = thisMoment;//sparar tiden för skapat inlägg loggBok.Add(post);//sparar inlägget i loggboken Console.WriteLine("Ditt inlägg är nu sparat!");//och skriver ut att det är gjort break;

Edit: blev galen indentering men du förstår nog poängen.

Skrivet av cp_:

Du gör i princip såhär... (någon form av pseudokod)

posts := List<array[]>()
post := string[3]

while(true)
{
post[0] = "titel"
post[1] = "tid"
post[2] = "meddelande"
posts.Add(post)
}

variabeln post deklareras INNAN loopen.

Du kommer att lägga till SAMMA variabel varje gång du kör posts.add(post)
Du kommer att skriva över värden i post VARJE gång du skriver post[0] = "titel"...

så resultatet kommer att bli en lista som ser ut såhär [post, post, post, post, post...]
där post innehåller det senaste värdena du stoppade in i post

Vad du skall göra är att skapa en NY variabel VARJE gång i loopen

posts := List<array[]>()
while(true)
{
post := post[3]
post[0] = "titel"
post[1] = "tid"
post[2] = "meddelande"
posts.Add(post)
}

det kommer att ge dig en lista som ser ut såhär [post1, post2, post3, ..., postN]

TACK så mycket för förklaringen hörni, nu fungerar det superbra!