Avatar billede msdb Nybegynder
29. oktober 2012 - 14:15 Der er 9 kommentarer og
1 løsning

Index was out of range

Jeg er i gang med at lære mig selv c#, men har siddet fast i nogle dage pga. en drilsk funktion som jeg ikke kan få til at virke.

Opgaven lyder at lave en webshop i form af et console-program, hvilket jeg har bygget op i nogle valgmenuer. Ved produktoversigten kan man vælge at tilføje det til en kurv, hvilket jeg har valgt at gøre med en liste af lister.

Programmet ser lige nu således ud:

Program.cs http://pastebin.com/QRfvpKHT
(Kunde.cs http://pastebin.com/zVChQ2sM )
Vissko.cs http://pastebin.com/wAqGz6aq
Skoliste.cs http://pastebin.com/wxh9YcRt
Kurv.cs http://pastebin.com/niks8pBV

Fejlen lyder:
{"Index was out of range. Must be non-negative and less than the size of the collection.\r\nParameter name: index"}

Den opstår i funktionen VisKurv i klassen Kurv (som kaldes i linje 95 af program.cs)
Funktionen AddKurv tilføjer en liste af produktinformationer til en liste, hvilket virker så vidt jeg kan teste mig frem til, men hvis det er tilfældet, hvorfor kan VisKurv så ikke udskrive det pågældende indeks?

For at gøre det så simpelt som muligt for mig selv har jeg kogt VisKurv ned til:

Console.WriteLine("{0}", list[0][0]);

Hvorfor er dette indeks "out of range"?
Vejledning ønskes.
Avatar billede Syska Mester
29. oktober 2012 - 14:42 #1
Kun et gæt ... men du har sikkert en kurv som har en list af vare. Kurven har et navn.

Jeg forstår dog ikke din "AddKurv" metode ... den bruger jo ikke noget fra Kurv klassen, så synes ikke det giver mening at oprette den der.

Jeg ville prøve at udskrive din data på den her måde:

foreach(var list in Overliste)
{
// Nu er list en List<string> ... // men svært at vide hvem der reelt tilhører da listen kun inholder en kurv med vare i.
foreach(var item in list)
{
Console.WriteLine(item); // item i din kurv.
}
}
Avatar billede arne_v Ekspert
29. oktober 2012 - 14:48 #2
Fejlen skyldes jo umiddelbart at enten den ydre eller indre liste er tom.

Naeste spoergsmaal er saa hvorfor!
Avatar billede msdb Nybegynder
29. oktober 2012 - 15:14 #3
Når jeg tilføjer linjen -

Console.WriteLine("{0}", smidikurv.Overliste[0][3]);

- lige efter at AddKurv kaldes udskrives strengen uden problem. Hvordan kan enten den indre eller ydre liste så være tom?

Ved at bruge [0][3], f.eks., henter jeg så ikke den 4. værdi fra den første (indre) liste?
Avatar billede Syska Mester
29. oktober 2012 - 15:35 #4
Hvis du køber en plastic pose, er der så noget i den :-) ...


List<string> list = new List<string>(); // <- Tom liste ...

En liste i liste ...

List<List<string>> list = new List<List<string>>(); // <- En liste ... som har en som liste ...

dvs ... list[0] er en liste ... men har ingen elementer du kan index dig ind i. Dvs list[0][0] giver en exception da der ikke er nogen elementer i den indre liste.
Avatar billede msdb Nybegynder
29. oktober 2012 - 16:09 #5
Hvordan kan den inder liste være tom, hvis førnævnte linje virker?
Avatar billede Syska Mester
29. oktober 2012 - 16:23 #6
Fordi det med 99% sikkerhed ikke er samme liste.

Du poster en masse kode til os, men vi kan ikke helt se hvordan du har sat det samme nu ...

Du siger du kalder:
Console.WriteLine("{0}", list[0][0]);

Antaget det er fra Kurv klassen ...

list tager du med som argument, men den liste som er i selve klassen bliver ikke brugt ... mærkeligt.

I din kode har du:
                    case '5':
                        Kurv hentkurv = new Kurv();
                        hentkurv.VisKurv(hentkurv.Overliste);
                        break;

Du opretter en kurv og udskriver den ... men du har ikke puttet noget i den ... så er det vel rimelig klart at den er tom. Dvs begge lister er tomme.

Hvor tilføjer du:
Console.WriteLine("{0}", smidikurv.Overliste[0][3]);

Måske den virker i andne kontekst end du lige har vist os ... hvis der også er ting i kurven på det tidspunkt.
Avatar billede msdb Nybegynder
29. oktober 2012 - 17:00 #7
Jeg tilføjer det i linje 79 af Vissko.cs. Det står allerede som kommentar i det jeg har smidt på pastebin. Det var et tidligere forsøg på at udskrive mig frem til fejlen.

Det virker måske kun fordi at det benyttes i samme kontekst som Addkurv?
Avatar billede Syska Mester
29. oktober 2012 - 17:13 #8
Du opretter du endnu en Kurv ... det skal selvfølgelig være samme kurv du arbejder på i hele programmet. Du kan ikke bare oprette en ny.

Simplificeret analogi:
Klasser er blueprint hvordan man laver ting ... new Kurv bruger du dit blueprint til at oprette en.

Dvs ...
public class Bil{}

Bil bil1 = new Bil();
Bil bil2 = new Bil();

Det er 2 helt forskellige instancer af samme klasse. De deler properties og methods. Men værdier af den er forskellige.

Jeg tror du skal læse op på classes og instantiation.
Avatar billede msdb Nybegynder
31. oktober 2012 - 20:21 #9
Efter noget mere læsning har jeg nu fået det til at fungere.
Tak til jer begge for hjælpen. Svar og modtag point :)
Avatar billede Syska Mester
31. oktober 2012 - 22:47 #10
svar
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