Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 17:30 Der 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?
Avatar billede arne_v Ekspert
06. januar 2011 - 17:40 #1
Proev:

List<Questions> questionsList = questQuery.Distinct().ToList();
Avatar billede arne_v Ekspert
06. januar 2011 - 17:41 #2
Random rnd = new Random();

ser ioevrigt suspekt ud.

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.
Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 17:42 #3
Det giver ingen forskel
Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 17:42 #4
Hov forrige kommentar var til distinct :-)

Hvordan skal man ellers lave random?
Avatar billede arne_v Ekspert
06. januar 2011 - 18:06 #5
private Random rnd = new Random();

eller

private static Random rnd = new Random();

uden for metoden.
Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 18:10 #6
Okay tak. Men det ændrer vel ikke noget i forhold til om samme element kommer ud flere gange, som er mit største problem..?
Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 18:15 #7
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..
Avatar billede arne_v Ekspert
06. januar 2011 - 18:22 #8
Ah. Forskellige ved forskellige koersler.

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.
Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 18:34 #9
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)
Avatar billede arne_v Ekspert
06. januar 2011 - 20:09 #10
Nu har jeg ikke ret meget af konteksten, men jeg kan godt proeve at bixe et eksempel som jeg kunne forestille mig det.
Avatar billede BenedikteJ Nybegynder
06. januar 2011 - 20:17 #11
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.
Avatar billede arne_v Ekspert
07. januar 2011 - 02:18 #12
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();
        }
    }
}
Avatar billede BenedikteJ Nybegynder
07. januar 2011 - 12:35 #13
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.
Avatar billede arne_v Ekspert
07. januar 2011 - 23:33 #14
Hvordan kan der komme gengangere hvis question bliver fjernet efter at have været vis en gang?
Avatar billede Thomas_S Nybegynder
27. februar 2011 - 16:12 #15
Hej Benedikte.

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 :)

Sig hvis det virker.

Mvh. Thomas Sandvær
Avatar billede BenedikteJ Nybegynder
27. februar 2011 - 16:30 #16
Tak for forslag. Det ser dog ikke ud til at ændre noget desværre.
Avatar billede Thomas_S Nybegynder
27. februar 2011 - 19:15 #17
Okay er nået frem til at distinct virker fint hvis du har Ienumerable<String>

Men du vil gerne køre foreach på dit objekt "f" ikke?
Avatar billede Thomas_S Nybegynder
27. februar 2011 - 20:01 #18
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();
Avatar billede BenedikteJ Nybegynder
30. marts 2011 - 17:40 #19
Tak for svar, opgaven er afleveret for længst men tak for dit forsøg - du får point.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester