Permalänk

Entity Framework med SQL C#

Tjena! Sitter och pillar med ett program där jag håller på att skapa ett dagis för katter. Har 30 katter totalt i 10 burar där dom sitter 3 och 3, tjejer med tjejer och killar med killar. Under dagisdagen skall dessa äta var 4e timme och gå ut och motionera minst 1 gång om dagen. Har inte börjat riktigt med just dom två metoderna, men dessa ska kallas på via en ticker som triggar trådar. Har googlat runt och försöker hitta något vettigt men än så länge inget som jag har förstått mig på riktigt. Har ni några tips på sidor/egen erfarenhet som kan hjälpa mig på rätt väg?

Permalänk
Medlem

Jag ser inte riktigt att det har att göra med EF utan uppgiften går mer ut på multithreading? Det finns olika sätt att göra det på i C#, threadpool är ganska smutt om man vill få till något snabbt och inte behöver så mycket kontroll, annars är det väl bara att göra det manuellt, skapa nya trådar med Thread och håll ordning på dem själv.

Permalänk
Medlem

Låter som du behöver köra https://www.hangfire.io eller motsvarande "CRON"-lösning

Permalänk
Skrivet av snajk:

Jag ser inte riktigt att det har att göra med EF utan uppgiften går mer ut på multithreading? Det finns olika sätt att göra det på i C#, threadpool är ganska smutt om man vill få till något snabbt och inte behöver så mycket kontroll, annars är det väl bara att göra det manuellt, skapa nya trådar med Thread och håll ordning på dem själv.

Nej, dålig rubrik kanske, vi jobbar med EF mot Databasen, detta har ju dock inte med det att göra utan det är ju själva metoderna i sig. Men säg såhär då, om jag vill att katterna skall äta var tredje timme, jag har en arrivaltime på dom, kan jag använda arrivaltiden och på något sätt få fram när det har gått 3 timmar? För att sedan kalla på dessa metoder i de nya trådarna jag skapar för själva simuleringen sen.

Permalänk
Medlem
Skrivet av PapaDiouf:

Nej, dålig rubrik kanske, vi jobbar med EF mot Databasen, detta har ju dock inte med det att göra utan det är ju själva metoderna i sig. Men säg såhär då, om jag vill att katterna skall äta var tredje timme, jag har en arrivaltime på dom, kan jag använda arrivaltiden och på något sätt få fram när det har gått 3 timmar? För att sedan kalla på dessa metoder i de nya trådarna jag skapar för själva simuleringen sen.

Jo det är inga konstigheter. Enklast är väl att ta ankomsttiden (eller senaste matningstiden i efterföljande fall), lägga på tre timmar och se om det är under eller lika med nu. Man kan göra det på olika sätt, men kolla datetime och de olika metoder som finns.

Det finns en del komplexiteter med att jobba med datum, som tidszoner, sommartid och så, men mycket av det är ju löst om man använder datetime och inte försöker snickra ihop något eget, och man slipper förstås fundera på tidszon och så om man inte tar tid som en input utan sätter den själv. Jag har stött på problem på grund av att någon typ bara använde tiden och inte datumet eller liknande, 00:00:01 är ju väldigt mycket mindre än 23:59:59 även om du kommer dit genom att lägga på två sekunder på det senare, så använd datetime helt enkelt.

Sen är det ju bra för testning att ha en timeprovider som ger tiden istället för att använda systemklockan. Då kan man injicera en klocka som bara går när man själv vill det, men på den här nivån kanske enhetstester inte är så viktigt.

Permalänk
Skrivet av snajk:

Jo det är inga konstigheter. Enklast är väl att ta ankomsttiden (eller senaste matningstiden i efterföljande fall), lägga på tre timmar och se om det är under eller lika med nu. Man kan göra det på olika sätt, men kolla datetime och de olika metoder som finns.

Det finns en del komplexiteter med att jobba med datum, som tidszoner, sommartid och så, men mycket av det är ju löst om man använder datetime och inte försöker snickra ihop något eget, och man slipper förstås fundera på tidszon och så om man inte tar tid som en input utan sätter den själv. Jag har stött på problem på grund av att någon typ bara använde tiden och inte datumet eller liknande, 00:00:01 är ju väldigt mycket mindre än 23:59:59 även om du kommer dit genom att lägga på två sekunder på det senare, så använd datetime helt enkelt.

Sen är det ju bra för testning att ha en timeprovider som ger tiden istället för att använda systemklockan. Då kan man injicera en klocka som bara går när man själv vill det, men på den här nivån kanske enhetstester inte är så viktigt.

Snyggt, tack för svar. Ska testa detta ikväll. Tanken med detta program är endast att en användare ska få välja hur många dagar som ska simuleras, annars ska programmet köra metoderna via threads osv, skrivas över till fil m.m. Har löst de flesta delarna, är i princip bara dessa metoder kvar nu där jag vill få in att dom äter var tredje timme och går ut en gång om dagen, så ska se om jag lyckas med detta!

Vi kör inga enhetstester osv än, men har läst kursplanen där jag såg att det kommer vid en senare kurs

Permalänk
Medlem
Skrivet av PapaDiouf:

Snyggt, tack för svar. Ska testa detta ikväll. Tanken med detta program är endast att en användare ska få välja hur många dagar som ska simuleras, annars ska programmet köra metoderna via threads osv, skrivas över till fil m.m. Har löst de flesta delarna, är i princip bara dessa metoder kvar nu där jag vill få in att dom äter var tredje timme och går ut en gång om dagen, så ska se om jag lyckas med detta!

Vi kör inga enhetstester osv än, men har läst kursplanen där jag såg att det kommer vid en senare kurs

Då råder jag dig att förbereda med en timeprovider. Timespan lär du behöva också så kolla lite på den med.

Permalänk
Skrivet av snajk:

Då råder jag dig att förbereda med en timeprovider. Timespan lär du behöva också så kolla lite på den med.

Har börjat kika lite på dessa och snubblade in på gamla hederliga DateTime, sitter och försöker klura lite på hur jag skall räkna ut detta, min matte håller knappt lågstadie nivå när det kommer till att räkna. Försöker med detta just nu:

using(var db = new CatContext()) { var query = from h in db.Cats select h; foreach(var item in query) { var arrival= item.ArrivalTime; var end = DateTime.Now; var result = end - arrival; if(arrival == end) { Console.WriteLine("Time to eat!"); } else { Console.WriteLine(result); } } }

Detta enbart för att testa, kommer stå vilka katter osv som ska äta m.m. Och är även medveten om att denna uträkning är totalt värdelös men tänkte om du har något tips på hur jag skall tänka istället. Vill få fram att när katterna har anlänt till dagis och det gått 3 timmar Går det att enbart använda DateTime med uträkning i detta scenario eller är jag helt ute och cyklar?

Permalänk
Medlem
Skrivet av PapaDiouf:

Vill få fram att när katterna har anlänt till dagis och det gått 3 timmar Går det att enbart använda DateTime med uträkning i detta scenario eller är jag helt ute och cyklar?

var feedingTime = cat.ArrivalTime.AddHours(3); if (feedingTime < DateTime.Now) { // Det har gått mer än 3 timmar sedan kattens ankomst }

Permalänk
Skrivet av hultron:

var feedingTime = cat.ArrivalTime.AddHours(3); if (feedingTime < DateTime.Now) { // Det har gått mer än 3 timmar sedan kattens ankomst }

Fungerade ju utmärkt! Tack för de.
Ska pilla med lite extra data som skall synas sen men ser ut såhär nu. Försöker att lägga till datan i kolumnen feeded som jag har i min tabell. Dock får jag ett felmeddelande från mina SaveChanges();. Antar att det kan ha att göra med att jag skapar ett nytt objekt utav klassen Cat fast jag egentligen bara vill lägga till i ett redan befintligt objekt? Behöver jag på något sätt alter table här eller har du något annat tips?

Cat k = new Cat(); using(var db = new CatContext()) { var query = from h in db.Cats select h; foreach (var dbCats in query) { var feedingTime = dbCats.ArrivalTime.AddHours(3); if(feedingTime < DateTime.Now) { k.Feeded = DateTime.Now; db.Cats.Add(k); Console.WriteLine("Feeded!"); db.SaveChanges(); } else { Console.WriteLine("Not hungry! "); } } db.SaveChanges(); return k; }

Permalänk
Medlem
Skrivet av PapaDiouf:

Fungerade ju utmärkt! Tack för de.
Ska pilla med lite extra data som skall synas sen men ser ut såhär nu. Försöker att lägga till datan i kolumnen feeded som jag har i min tabell. Dock får jag ett felmeddelande från mina SaveChanges();. Antar att det kan ha att göra med att jag skapar ett nytt objekt utav klassen Cat fast jag egentligen bara vill lägga till i ett redan befintligt objekt? Behöver jag på något sätt alter table här eller har du något annat tips?

Cat k = new Cat(); using(var db = new CatContext()) { var query = from h in db.Cats select h; foreach (var dbCats in query) { var feedingTime = dbCats.ArrivalTime.AddHours(3); if(feedingTime < DateTime.Now) { k.Feeded = DateTime.Now; db.Cats.Add(k); Console.WriteLine("Feeded!"); db.SaveChanges(); } else { Console.WriteLine("Not hungry! "); } } db.SaveChanges(); return k; }

Du itererar ju över listan med katter som du hämtat från databasen, men du uppdaterar den nya katten som du skapar innan loopen.

dbCat.Feeded = DateTime.Now; // Kallar den för dbCat istället för dbCats, då det bara är en katt db.Cats.Update(dbCat);

Visa signatur

| EVGA Z170 FTW | i7 6700k | ASUS RTX 3070 | 16GB DDR4 3200MHz | Cooler Master V850 | Samsung 840 Evo 250GB + 2x WD Black 500GB + Seagate 2TB SSHD + Samsung 970 Evo M.2 500GB |

Permalänk
Skrivet av BrutalSwede:

Du itererar ju över listan med katter som du hämtat från databasen, men du uppdaterar den nya katten som du skapar innan loopen.

dbCat.Feeded = DateTime.Now; // Kallar den för dbCat istället för dbCats, då det bara är en katt db.Cats.Update(dbCat);

Jäklar ja, fanns en enkel metod för det alltså! Det fungerade utmärkt, nu får dom även käk, o så gör jag ju bara liknande för när katterna skall ut och leka. Dock fick jag inte lov att spara ändringarna i loopen, utan det fungerade endast efteråt, vilket inte spelar någon roll kanske? Den gör ju det jag vill åtminstone, sparar ändringarna i databasen efter att dom har fått mat.

dbCat.Feeded = DateTime.Now; db.Cats.AddOrUpdate(dbCat); Console.WriteLine("Feeded!"); //db.SaveChanges(); //Kommenterade bort denna och då fungerade det. } else { Console.WriteLine("Not hungry! "); } } db.SaveChanges();

Permalänk
Medlem
Skrivet av PapaDiouf:

Jäklar ja, fanns en enkel metod för det alltså! Det fungerade utmärkt, nu får dom även käk, o så gör jag ju bara liknande för när katterna skall ut och leka. Dock fick jag inte lov att spara ändringarna i loopen, utan det fungerade endast efteråt, vilket inte spelar någon roll kanske? Den gör ju det jag vill åtminstone, sparar ändringarna i databasen efter att dom har fått mat.

dbCat.Feeded = DateTime.Now; db.Cats.AddOrUpdate(dbCat); Console.WriteLine("Feeded!"); //db.SaveChanges(); //Kommenterade bort denna och då fungerade det. } else { Console.WriteLine("Not hungry! "); } } db.SaveChanges();

Rent generellt så vill du inte spara dina ändringar konstant, speciellt inte i en loop. För varje gång du kör db.SaveChanges() så kommer den försöka skriva till databasen och skrivningar är tungt.

Permalänk
Skrivet av asabla:

Rent generellt så vill du inte spara dina ändringar konstant, speciellt inte i en loop. För varje gång du kör db.SaveChanges() så kommer den försöka skriva till databasen och skrivningar är tungt.

Förstår! Make sense också. Lite overkill att göra de såpass ofta kanske också ^^ Tack för hjälpen! Måhända att jag återkommer när jag skall få ihop hela simuleringen med hjälp av ticks osv, men lovar att googla lite innan

Permalänk
Skrivet av PapaDiouf:

Förstår! Make sense också. Lite overkill att göra de såpass ofta kanske också ^^ Tack för hjälpen! Måhända att jag återkommer när jag skall få ihop hela simuleringen med hjälp av ticks osv, men lovar att googla lite innan

Insåg precis att det enbart får vara 8 st som får mat samtidigt. Bör jag skapa en klass matplats exempelvis, och lägga till ett matplatsID när det är dags att äta eller hur kan jag kolla så att enbart de första 8 äter, kommer tillbaka till sin bur och sedan nästa åtta om de alla har kommit samtidigt till dagis?

using (var db = new CatContext()) { try { var query = from h in db.Cats select h; foreach (var dbCat in query.ToList()) { var feedingTime = dbCat.ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now) // Tar större än här för att få resultat när jag testkör { dbCat.Feeded = DateTime.Now; db.Cats.AddOrUpdate(dbCat); ConsoleText.PrintWhoJustAte(dbCat); } else { ConsoleText.PrintNoOneIsHungry(); break; } } db.SaveChanges(); } catch (Exception msg) { ConsoleText.PrintErrorMessage(msg); } finally { ConsoleText.PrintReturnToMenu(); } } }

Permalänk
Medlem
Skrivet av PapaDiouf:

Insåg precis att det enbart får vara 8 st som får mat samtidigt. Bör jag skapa en klass matplats exempelvis, och lägga till ett matplatsID när det är dags att äta eller hur kan jag kolla så att enbart de första 8 äter, kommer tillbaka till sin bur och sedan nästa åtta om de alla har kommit samtidigt till dagis?

using (var db = new CatContext()) { try { var query = from h in db.Cats select h; foreach (var dbCat in query.ToList()) { var feedingTime = dbCat.ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now) // Tar större än här för att få resultat när jag testkör { dbCat.Feeded = DateTime.Now; db.Cats.AddOrUpdate(dbCat); ConsoleText.PrintWhoJustAte(dbCat); } else { ConsoleText.PrintNoOneIsHungry(); break; } } db.SaveChanges(); } catch (Exception msg) { ConsoleText.PrintErrorMessage(msg); } finally { ConsoleText.PrintReturnToMenu(); } } }

Utan att säga för mycket, så skulle jag säga kolla på att göra saker i en batch (ett fast nummer med entiteter som behandlas samtidigt), men för att prata LINQ se skip/take

Permalänk
Skrivet av asabla:

Utan att säga för mycket, så skulle jag säga kolla på att göra saker i en batch (ett fast nummer med entiteter som behandlas samtidigt), men för att prata LINQ se skip/take

Kollade en del på take, den gör ju precis som den ska. Här försöker jag nu att få åtta katter att äta samtidigt när deras mattider kickar in. Det får ju bara vara 8 stycken åt gången och om fler har samma mattid så vill jag liksom att första åtta ska få äta, sedan kommer nästa åtta in och äter osv. Försöker med detta just nu:

var cats = db.Cats.Select(H => H).ToList(); for (int i = 0; i < 8; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cats [i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && hamster[i].Gender == "Male") { cats [i].FeedingArea = newFeedingArea; cats [i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; Console.WriteLine(cats[i].Name + " just ate"); if(newFeedingArea.AvailableSpace == false) { cats [i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } } }

Vill liksom att allt skall loopas i ett, jag har 30 katter som ska äta samtidigt, 15 killar och 15 tjejer, nu äter dock bara dom första åtta killarna varje gång jag kör detta haha. Kanske suttit för länge idag vem vet, sitter dock fast just nu. Ser du någon simpel lösning på detta? Hur bör jag tänka?
Obs testar endast för killarna nu innan jag försöker få in tjejerna också

Permalänk
Medlem
Skrivet av PapaDiouf:

nu äter dock bara dom första åtta killarna varje gång jag kör detta haha

Mitt tips är att du läser just det här du skrev och kollar en gång till på hur du har skrivit din loop

Permalänk
Skrivet av asabla:

Mitt tips är att du läser just det här du skrev och kollar en gång till på hur du har skrivit din loop

Hmm.. Om jag ändrar att loopen skall köra igenom alla katter, kolla om dom är hungriga, därifrån vill jag att dom första 8 som är hungriga ska äta, om fler är hungriga så ska dom äta efteråt. Så,
loopar igenom katterna. Sedan måste jag få in någonstans att endast 8 kan äta samtidigt, någon if sats?

var cats = db.Cats.Select(H => H).ToList(); for (int i = 0; i < cat.Count; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cats [i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && hamster[i].Gender == "Male") { cats [i].FeedingArea = newFeedingArea; cats [i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; Console.WriteLine(cats[i].Name + " just ate"); if(newFeedingArea.AvailableSpace == false) { cats [i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } } }

Permalänk
Medlem
Skrivet av PapaDiouf:

Hmm.. Om jag ändrar att loopen skall köra igenom alla katter, kolla om dom är hungriga, därifrån vill jag att dom första 8 som är hungriga ska äta, om fler är hungriga så ska dom äta efteråt. Så,
loopar igenom katterna. Sedan måste jag få in någonstans att endast 8 kan äta samtidigt, någon if sats?

var cats = db.Cats.Select(H => H).ToList(); for (int i = 0; i < cat.Count; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cats [i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && hamster[i].Gender == "Male") { cats [i].FeedingArea = newFeedingArea; cats [i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; Console.WriteLine(cats[i].Name + " just ate"); if(newFeedingArea.AvailableSpace == false) { cats [i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } } }

Vad du får göra är att hålla koll på hur många du matat med en räknare och bryta loopen när du har matat åtta. Om du kollar i for-loopen (med 8) så kommer den ju bara att gå igenom de åtta första men det säger ju inget om just de hade uppnått tid för matning eller blivit matade.

Permalänk
Skrivet av snajk:

Vad du får göra är att hålla koll på hur många du matat med en räknare och bryta loopen när du har matat åtta. Om du kollar i for-loopen (med 8) så kommer den ju bara att gå igenom de åtta första men det säger ju inget om just de hade uppnått tid för matning eller blivit matade.

Bra tips med counten. Nu gör den åtminstone som jag vill, sista grejjen som jag vill ha in nu är att om det endast är 7 killar som äter så skall inte den 8e platsen fyllas på av en tjej.. Något bra tips?

using (var db = new CatContext()) { var count = 0; var cat= db.Cats.Select(H => H).ToList(); for (int i = 0; i < cat.Count; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cat[i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && cat[i].Gender == "Male") { if(count <= 8 && cat[i].Feeded == null) { cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } else if(feedingTime > DateTime.Now && cat[i].Gender == "Female") { if (count <= 8 && cat[i].Feeded == null) { cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } } ConsoleText.PrintReturnToMenu(); db.SaveChanges(); }

Permalänk
Medlem
Skrivet av PapaDiouf:

Bra tips med counten. Nu gör den åtminstone som jag vill, sista grejjen som jag vill ha in nu är att om det endast är 7 killar som äter så skall inte den 8e platsen fyllas på av en tjej.. Något bra tips?

using (var db = new CatContext()) { var count = 0; var cat= db.Cats.Select(H => H).ToList(); for (int i = 0; i < cat.Count; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cat[i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && cat[i].Gender == "Male") { if(count <= 8 && cat[i].Feeded == null) { cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } else if(feedingTime > DateTime.Now && cat[i].Gender == "Female") { if (count <= 8 && cat[i].Feeded == null) { cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } } ConsoleText.PrintReturnToMenu(); db.SaveChanges(); }

Jag hade nog lagt upp det med en bool som är typ isMaleFeeding, sen sätter du den när du hittar den första att mata och använder den som ett villkor i bedömningen ifall efterföljande katter ska matas.

Permalänk
Skrivet av snajk:

Jag hade nog lagt upp det med en bool som är typ isMaleFeeding, sen sätter du den när du hittar den första att mata och använder den som ett villkor i bedömningen ifall efterföljande katter ska matas.

Bra tips, herrejävlar vet inte om jag är alldeles för trött eller om jag bara är så jävla seg i skallen.. Har pluggat detta ett bra tag nu och bools är liksom basic men står tamejfan helt still här.. Den kör ju bara killarna nu som jag vill men loopen når ju liksom inte ner till tjejerna.. Vart gör jag fel??

using (var db = new CatContext()) { bool maleFeeding = false; var count = 0; var cat= db.Cats.Select(H => H).ToList(); for (int i = 0; i < cat.Count; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cat[i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && cat[i].Gender == "Male") { if(count <= 8) { maleFeeding = true; cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } else if(feedingTime > DateTime.Now && cat[i].Gender == "Female" && maleFeeding == false) { if (count <= 8) { cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } } ConsoleText.PrintReturnToMenu(); db.SaveChanges(); }

Permalänk
Medlem
Skrivet av PapaDiouf:

Bra tips, herrejävlar vet inte om jag är alldeles för trött eller om jag bara är så jävla seg i skallen.. Har pluggat detta ett bra tag nu och bools är liksom basic men står tamejfan helt still här.. Den kör ju bara killarna nu som jag vill men loopen når ju liksom inte ner till tjejerna.. Vart gör jag fel??

using (var db = new CatContext()) { bool maleFeeding = false; var count = 0; var cat= db.Cats.Select(H => H).ToList(); for (int i = 0; i < cat.Count; i++) { var newFeedingArea = new FeedingArea() { AvailableSpace = true }; db.FeedingArea.Add(newFeedingArea); db.SaveChanges(); var feedingTime = cat[i].ArrivalTime.AddHours(3); if (feedingTime > DateTime.Now && cat[i].Gender == "Male") { if(count <= 8) { maleFeeding = true; cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } else if(feedingTime > DateTime.Now && cat[i].Gender == "Female" && maleFeeding == false) { if (count <= 8) { cat[i].FeedingArea = newFeedingArea; cat[i].Feeded = DateTime.Now; newFeedingArea.AvailableSpace = false; ConsoleText.PrintWhoJustAte(cat[i]); if (newFeedingArea.AvailableSpace == false) { cat[i].FeedingArea = null; newFeedingArea.AvailableSpace = true; } count++; } if (count == 8) { count = 0; ConsoleText.PrintFeedingAreaIsFull(); } } } ConsoleText.PrintReturnToMenu(); db.SaveChanges(); }

Jag råder dig att testa med debuggern. Vad händer när du skickar in en hankatt och resten honor exempelvis, andra loopen borde den ta honorna men gör den inte det så får du försöka hitta vart de sorteras bort liksom.

Som det är nu kommer en hankatt att sätta om till "hanmatning" oavsett om det finns honor som matats i loopen tidigare.

Sen bör du nog fundera lite på feeding area. Nu skapar du en ny feeding area för varje katt.

Permalänk
Skrivet av snajk:

Jag råder dig att testa med debuggern. Vad händer när du skickar in en hankatt och resten honor exempelvis, andra loopen borde den ta honorna men gör den inte det så får du försöka hitta vart de sorteras bort liksom.

Som det är nu kommer en hankatt att sätta om till "hanmatning" oavsett om det finns honor som matats i loopen tidigare.

Sen bör du nog fundera lite på feeding area. Nu skapar du en ny feeding area för varje katt.

Ja, alltså, sätter jag bool = false när count == 8 så loopar den ju först fram 8 hankatter, sedan 7 hankatter(eftersom jag har 15 hanar) och så börjar den lägga till honorna efter det och då hamnar en hona tillsammans med dom 7 hanarna. Så jag vet vart det blir fel men vet inte hur jag ska lägga upp det annorlunda. Angående feedingarea så vet jag att den är knasig men tänkte ordna med den när jag får rätt på vilka som äter. Eller om man kanske kan använda den på något sätt för att sätta någon gräns 🤔

Permalänk
Medlem
Skrivet av PapaDiouf:

Ja, alltså, sätter jag bool = false när count == 8 så loopar den ju först fram 8 hankatter, sedan 7 hankatter(eftersom jag har 15 hanar) och så börjar den lägga till honorna efter det och då hamnar en hona tillsammans med dom 7 hanarna. Så jag vet vart det blir fel men vet inte hur jag ska lägga upp det annorlunda. Angående feedingarea så vet jag att den är knasig men tänkte ordna med den när jag får rätt på vilka som äter. Eller om man kanske kan använda den på något sätt för att sätta någon gräns 🤔

Tja, var inte rädd för att dela upp sakerna mer. Du kan ju exempelvis plocka ut åtta katter av rätt kön till en egen lista innan du matar dom i en separat loop eller liknande. Eller i alla fall sätta vilket kön det ska vara utanför loopen där du kollar igenom dina katter. Sen kanske det inte är det bästa att sätta könet baserat på den första du hittar utan köra varannan loop eller liknande.

Som nybörjare på programmering har man ju en tendens att göra för mycket på en gång liksom, men man ska inte vara rädd för att ha flera metoder och klasser som bara gör en sak liksom.

Permalänk
Medlem
Skrivet av PapaDiouf:

Ja, alltså, sätter jag bool = false när count == 8 så loopar den ju först fram 8 hankatter, sedan 7 hankatter(eftersom jag har 15 hanar) och så börjar den lägga till honorna efter det och då hamnar en hona tillsammans med dom 7 hanarna. Så jag vet vart det blir fel men vet inte hur jag ska lägga upp det annorlunda. Angående feedingarea så vet jag att den är knasig men tänkte ordna med den när jag får rätt på vilka som äter. Eller om man kanske kan använda den på något sätt för att sätta någon gräns 🤔

Skrivet av snajk:

Tja, var inte rädd för att dela upp sakerna mer. Du kan ju exempelvis plocka ut åtta katter av rätt kön till en egen lista innan du matar dom i en separat loop eller liknande. Eller i alla fall sätta vilket kön det ska vara utanför loopen där du kollar igenom dina katter. Sen kanske det inte är det bästa att sätta könet baserat på den första du hittar utan köra varannan loop eller liknande.

Som nybörjare på programmering har man ju en tendens att göra för mycket på en gång liksom, men man ska inte vara rädd för att ha flera metoder och klasser som bara gör en sak liksom.

Precis som snajk skriver så tycker jag att du gör det lite mer komplicerat mot vad det behöver vara. Testa att skriva lite pseudokod för att enkla bygga upp en mental bild av hur flödet är tänkt att fungera. Därefter kan du börja bryta ut kod i metoder eller rent av kanske skriva om vissa bitar.

Permalänk

Bra tips från er! Ska testa mig fram lite olika här nu. Återkommer med resultat!

Permalänk

Okej, nu har jag fått till det. Följde era råd någorlunda, gjorde om det till två metoder istället helt enkelt, där jag i ena metoden kollar om någon hane måste äta och i den andra kollar jag om någon hona måste äta, det funkar åtminstone och gör som jag vill. Behöver någon äta så skrivs det ut och är ingen hungrig så skrivs det ut, det skall ju bara köras efter varann så tycker ändå lösningen blev helt ok! Tack för bra tips, ska fortsätta här med nästa metod som är att släppa ut hamstrarna att leka. Bör funka att göra det på liknande vis som detta, återkommer om jag fastnar igen :'D