06. januar 2011 - 17:30Der er
18 kommentarer og 1 løsning
Liste, hente info uden gengangere
Jeg har en liste, som fyldes med info fra en sqLite database og fra den liste henter jeg et element ud med random, da jeg bare skal have en tilfældig hentet ud. Mit problem er så, at jeg gerne vil undgå at samme element hentes ud flere gange, men det kan jeg ikke lige få til at virke.
Min kode er:
Matematik.DbTestEntities db = new DbTestEntities();
var questQuery = from f in db.Questions where f.Grad == grad select f;
List<Questions> questionsList = questQuery.ToList(); Random rnd = new Random(); Questions question = questionsList[rnd.Next(0, questionsList.Count - 1)]; QuestionBox.Image = Image.FromFile(question.Tekst);
Jeg har prøvet at få distinct ind, men kan ikke lige få det til at virke. Er der nogen der har forslag?
Din app boer bruge saa faa Random objekter som muligt og kalde dem mange gange fremfor at lave et Random objekt hver gang du skal bruge et tilfaeldigt tal.
Nå ja, det er nok relevant at tilføje at koden for så vidt fungerer. Random henter et tilfældigt element (en opgave) ud fra listen. Den besvarer brugeren ved at klikke på en knap, hvorefter programmet looper ovenstående kode og igen henter en random opgave ud.
Meningen er så, at samme opgave som brugeren har svaret på IKKE skal komme igen. Lige for at tilføje..
Saa kan du enten gemme listen melle kaldene og fjerne dem der er vist eller gemme dem der er vist i et Dictionary og saa traekk een ny hvis den allerede er vist.
Kan du give et kodeeksempel på hvordan man kan gøre det, eller er det for omfattende? (Det er ude i noget jeg forstår men ikke har lavet før så derfor jeg ikke lige kan sætte det sammen)
Et eksempel ville være super. Der er ikke så meget mere kode at vise til det. Det skrevne kode er min metode GameLoop. Når man starter spillet køres GameLoop(). Når spiller klikker på en knap/picturebox, køres GameLoop() igen - og det sker hver gang spiller klikker på knappen til loopet har kørt 5 gange, så kommer der en afslutning.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public class QuestionAnswer { public string Question { get; set; } public string Answer { get; set; } } public partial class Form1 : Form { private List<QuestionAnswer> qa; private Random rng;
public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { if (qa.Count > 0) { int ix = rng.Next(qa.Count); label1.Text = qa[ix].Question; qa.RemoveAt(ix); } else { label1.Text = "Ikke flere spørgsmål"; } }
private void Form1_Load(object sender, EventArgs e) { // her simulerer vi at vi loader fra databasen qa = new List<QuestionAnswer>(); qa.Add(new QuestionAnswer { Question = "Hvad er 2+2", Answer = "2" }); qa.Add(new QuestionAnswer { Question = "Hvilket bogstav kommer efter C", Answer = "D" }); qa.Add(new QuestionAnswer { Question = "Hvad hedderDanmarks hovedstad", Answer = "København" }); rng = new Random(); } } }
Tak for det. Når jeg skriver det ind i konteksten så ændrer det dog ikke rigtigt noget. Der kommer stadig gengangere, så det ved jeg ikke helt hvorfor.
Jeg er nyuddannet datamatiker, og jeg har ikke testet mit forlag til dig, så du må endelig ikke hænge mig op på noget :)
I din første post laver du et linqToEntity query, hvor du ender med en Enumerable collection. var questQuery = from f in db.Questions where f.Grad==grad select f;
Bagefter kan jeg se at du typecaster den til en List.
Som sagt har jeg ikke efterprøvet mit forslag men du kan prøve følgende (inden du typecaster til List):
var questQueryDistinct = questQuery.Distinct();
så skal du selvfølgelig lige huske at det er "questQueryDistinct" Du skal caste til List :)
Hej vi prøver lige igen... har lige googlet lidt og fandt frem til noget du nok kan bruge... har testet det denne her gang, så ved det virker :)
Nu kan jeg jo ikke lige gennemskue hvad det er du får duplikater af... dette er et eksempel på at du ikke vil vise 2 objekter med samme Name property. var questQuery = from f in db.Questions where f.Grad == grad group f by f.Name into uniqueNames select uniqueNames.FirstOrDefault();
Tak for svar, opgaven er afleveret for længst men tak for dit forsøg - du får point.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.