[C#] Probleempje met gegeven updaten die in list staan

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sythani
  • Registratie: September 2011
  • Laatst online: 27-05-2021
Beste GoT,

Ben sinds kort bezig met het leren van C#. Kan hier nu al aardig mee werken maar zit de laatste tijd vast op een stukje code.
Ben bezig met het maken van een Console Applicatie voor een mp3 winkel om hier standaard acties te kunnen uitvoeren. Ben nu alleen bezig om van de gegevens in de list staan, die te kunnen veranderen.

Aanmaken List
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void MaakMP3Add2List(int id, string make, string model, double price, int mbSize, int voorraad)
        {
            
            MP3 mp3 = new MP3();
            mp3.ID = id;
            mp3.Make = make;
            mp3.Model = model;
            mp3.Price = price;
            mp3.MBSize = mbSize;
            mp3.Voorraad = voorraad;

            try
            {
                mp3lijst.Add(mp3);
            }
            catch(Exception ex)
            {
                Console.WriteLine("Toevoegen lijst mislukt" + ex.Message);
            }
        }


List toevoeging
C#:
1
2
3
4
5
6
7
8
9
10
public Hoofdmenu()
        {
            MaakMP3Add2List(1, "GET Technologies .inc", "HF-410", 129.95, 4096, 500);
            MaakMP3Add2List(2, "Apple", "iPod Touch", 159.98, 8192, 500);
            MaakMP3Add2List(3, "Sony", "NWZ-E453", 57.50, 4096, 500);
            MaakMP3Add2List(4, "Samsung", "Galaxy G50", 139.00, 16384, 500);
            MaakMP3Add2List(5, "Sandisk", "Sansa Clip+", 28.99, 2048, 500);

            ShowMenu();
        }


Zoals jullie zien staat de input voor de List in de constructor.
Echter, als ik bij mijn case in de switch om de voorraad te kunnen muteren, weet ik me geen raad.
Iemand misschien een idee hoe ik dit moet aanpakken of een handige link ervoor heeft?

Alvast bedankt! :D

Sythani.

[ Voor 0% gewijzigd door BtM909 op 19-07-2012 00:25 ]


Acties:
  • 0 Henk 'm!

  • ZaPPZion
  • Registratie: Februari 2009
  • Laatst online: 28-08 12:46
met een beetje LINQ:
C#:
1
2
mp3object = FROM mp3 IN mp3lijst WHERE mp3.ID = kieszelfmaar SELECT mp3;
mp3object.Voorraad = nieuwevoorraad;


EDIT: FAIL! wel ongeveer het idee, maar klopt nog niet helemaal, lees verder onderaan

[ Voor 22% gewijzigd door ZaPPZion op 13-06-2012 20:15 ]


Acties:
  • 0 Henk 'm!

  • PeaceNlove
  • Registratie: Juni 2004
  • Laatst online: 15:11

PeaceNlove

Deugleuter

ZaPPZion schreef op woensdag 13 juni 2012 @ 18:58:
met een beetje LINQ:
C#:
1
2
mp3object = FROM mp3 IN mp3lijst WHERE mp3.ID = kieszelfmaar SELECT mp3;
mp3object.Voorraad = nieuwevoorraad;
LINQ geeft je altijd een IEnumerable, dus je zult eerst nog even moeten checken of de IEnumerable gevuld is en zoja daarvan het eerste item moeten pakken...

Acties:
  • 0 Henk 'm!

  • ZaPPZion
  • Registratie: Februari 2009
  • Laatst online: 28-08 12:46
Oja, dat is waar ook, sorry 'bout that :). Was een beetje te makkelijk, maargoed, update:
EDIT: FAIL!

[ Voor 50% gewijzigd door ZaPPZion op 13-06-2012 20:14 ]


Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Nee, eerder iets als:

C#:
1
2
3
4
5
6
var mp3object = (from mp3 in mp3lijst where mp3.ID == kieszelfmaar select mp3).SingleOrDefault(); //Of .FirstOrDefault als er meerdere mp3's met dezelfde ID zijn (waarschijnlijk niet)

if (mp3object != null) 
{ 
    mp3object.Voorraad = nieuwevoorraad;
} 


Want het resultaat van een LINQ query (het gedeelte tussen haakjes) is altijd een IEnumerable en zal ook nooit null zijn.
Wel kan het resultaat een lege IEnumerable zijn (te checken met .Any())

[ Voor 24% gewijzigd door HMS op 13-06-2012 19:39 ]


Acties:
  • 0 Henk 'm!

  • Sythani
  • Registratie: September 2011
  • Laatst online: 27-05-2021
Ok dit ziet er veel belovend uit! Ga het morgen even implementeren en dan gelijk testen! Ik hou jullie op de hoogte ! Misschien als vanavond als ik nog ff tijd zie tussen het voetballen door, waarschijnlijk niet x) but you'll never know!

Acties:
  • 0 Henk 'm!

  • ZaPPZion
  • Registratie: Februari 2009
  • Laatst online: 28-08 12:46
Klopt, beetje rusty hier wat betreft C#, ik zal mijn dingetjes eens ff deleten, want dat lijkt nergens op :P

Acties:
  • 0 Henk 'm!

  • Sythani
  • Registratie: September 2011
  • Laatst online: 27-05-2021
C#:
1
2
3
4
if (mp3object != null) 
{ 
    mp3object.Voorraad = nieuwevoorraad;
} 
Bij dit stukje code geeft hij bij mij een error, dat is namelijk:

Operator '!=' cannot be applied to operands of type 'SoundSharp.MP3' and '<null>'

Denk dat deze error komt omdat er in mijn list een fout zit misschien?

Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Structs kunnen niet null zijn. Weet je zeker dat je een struct nodig hebt en geen klasse? Let ook op de verschillen tussen deze twee.

Acties:
  • 0 Henk 'm!

Verwijderd

Structs kunnen zeker wel null zijn, het is eigenlijk alleen niet de bedoeling dat je ze zo gebruikt omdat het value types zijn.
Je moet ze alleen nullable maken door Nullable<T> te gebruiken waar <T> het type is wat je nullable wilt maken, in dit geval struct.
In plaats van elke keer Nullable<T> te gebruiken is het makkelijker om gewoon het type in te geven wat je wilt nullable maken met een vraagteken erachter.
Je kan alle value types nullable maken, of dit gewenst is durf ik eerlijk gezegd niet te zeggen.
Ik heb ze alleen gebruikt in combinatie met wat programma's die SQL server gebruikten om null velden af te vangen.

Voorbeeld van een nullable struct:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;

namespace NullableStruct
{
    public struct TestStruct
    {
        public int ID;
    }

    class Program
    {
        static void Main(string[] args)
        {
            TestStruct? str = null;
            TestStruct modify;
            str = new TestStruct();
            modify = (TestStruct)str;
            modify.ID = 100;
            str = modify;

            Console.WriteLine("str.ID = {0}", str.Value.ID);
            Console.ReadKey(true);
        }
    }
}


Wel zou ik mezelf afvragen of het misschien niet beter is om een class te gebruiken in plaats van struct in dit geval?
Met struct is het nog extra omslachtig omdat je eerst deze moet terug casten naar een 'normale' struct alvorens je de waarde kan veranderen, wanneer alle gewenste waardes zijn aangepast kun je het weer terug casten in de nullable type.

Ik denk dat het in dit geval beter is om een class te gebruiken, sowieso omdat je deze gewoon null kunt maken.

Denkend aan:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;

namespace Mp3ToList
{
    class Mp3
    {
        public int Id { get; set; }
        public string Make { get; set; }
        public string Model { get; set; }
        public decimal Price { get; set; }
        public int Storage { get; set; }
        public int Voorraad { get; set; }

        public Mp3() { }

        public Mp3(int id, string make, string model, decimal price, int storage, int voorraad)
        {
            Id = id;
            Make = make;
            Model = model;
            Price = price;
            Storage = storage;
            Voorraad = voorraad;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Mp3[] mp3 =
            { 
                new Mp3(1, "GET Technologies .inc", "HF-410", 129.95m, 4096, 500),
                new Mp3(2, "Apple", "iPod Touch", 159.98m, 8192, 500),
                new Mp3(3, "Sony", "NWZ-E453", 57.50m, 4096, 500),
                new Mp3(4, "Samsung", "Galaxy G50", 139.00m, 16384, 500),
                new Mp3(5, "Sandisk", "Sansa Clip+", 28.99m, 2048, 500),
                null
            };
        }
    }
}

[ Voor 26% gewijzigd door Verwijderd op 13-06-2012 23:40 ]


Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Nu online
Verwijderd schreef op woensdag 13 juni 2012 @ 23:28:
Structs kunnen zeker wel null zijn, het is eigenlijk alleen niet de bedoeling dat je ze zo gebruikt omdat het value types zijn.
Je moet ze alleen nullable maken door Nullable<T> te gebruiken waar <T> het type is wat je nullable wilt maken, in dit geval struct.
[...]
Wat stiekem ook gewoon een struct oplevert (System.Nullable) dus geen null. Alleen een struct die toevallig ook null kan bevatten.

[ Voor 5% gewijzigd door Caelorum op 13-06-2012 23:45 ]


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Verwijderd schreef op woensdag 13 juni 2012 @ 23:28:
Structs kunnen zeker wel null zijn, het is eigenlijk alleen niet de bedoeling dat je ze zo gebruikt omdat het value types zijn.
[...]
Mwah, je kunt ze vergelijken met null doordat ze geboxed worden (bij object.Equals(object)). Zelf zijn ze niet null. Bij een vergelijking van een nullable type met nog een nullable type, worden eerst de .HasValues vergeleken. Wanneer één van de twee niet nullable wordt deze eerst gecast naar nullable. Ze nemen de volledige geheugenruimte in die je voor de normale struct ook zou verwachten. Bij een object is dit niet het geval.

Maar goed, ik geef je in dat geval gelijk. Voor de programmeur ziet het eruit ofdat hij een Nullable<struct> gewoon kan assignen met null. Lijkt mij een beetje ver gaan voor dit topic. Daarom denk ik dat de TS eerst het verschil tussen struct en object moet zien en een juiste keuze moet maken. Deze keuze laat ik dan ook bij de TS liggen om er wat van te leren. :)

Acties:
  • 0 Henk 'm!

Verwijderd

Zo goed heb ik er eigenlijk nooit naar gekeken moet ik zeggen, ik wist alleen dat het mogelijk was.
Als ik het goed lees op MSDN dan zie ik dat Nullable<T> de waarde neemt uit de value type en deze boxed, betekent dat dus dat er eigenlijk een kopie word gemaakt van deze waarde en dat dit eigenlijk gewoon een object is?

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op donderdag 14 juni 2012 @ 09:56:
Zo goed heb ik er eigenlijk nooit naar gekeken moet ik zeggen, ik wist alleen dat het mogelijk was.
Als ik het goed lees op MSDN dan zie ik dat Nullable<T> de waarde neemt uit de value type en deze boxed, betekent dat dus dat er eigenlijk een kopie word gemaakt van deze waarde en dat dit eigenlijk gewoon een object is?
Ja:
Boxing is used to store value types in the garbage-collected heap. Boxing is an implicit conversion of a value type to the type object or to any interface type implemented by this value type. Boxing a value type allocates an object instance on the heap and copies the value into the new object.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Sythani
  • Registratie: September 2011
  • Laatst online: 27-05-2021
Ik heb zoals boven vermeldt werdt de struct omgebouwd naar een klasse. Echter nu komt ik op het volgende probleem :(

Bij het stukje code van Mostrow:
code:
1
2
3
4
5
6
7
8
9
            Mp3[] mp3 = 
            {  
                new Mp3(1, "GET Technologies .inc", "HF-410", 129.95m, 4096, 500), 
                new Mp3(2, "Apple", "iPod Touch", 159.98m, 8192, 500), 
                new Mp3(3, "Sony", "NWZ-E453", 57.50m, 4096, 500), 
                new Mp3(4, "Samsung", "Galaxy G50", 139.00m, 16384, 500), 
                new Mp3(5, "Sandisk", "Sansa Clip+", 28.99m, 2048, 500), 
                null 
            };


Dit wilt hij niet in mijn list laden, komt die niet doordat hij voor elke mp3 een nieuwe aanmaakt?
Want nu pakt hij mijn loopjes ook niet meer waar hij de gegevens eerst mee laadde.

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

"Wil niet" en "pakt niet" zijn geen foutmeldingen.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Sythani
  • Registratie: September 2011
  • Laatst online: 27-05-2021
Ik krijg ook geen foutmeldingen, de code is goed. Hij laadt alleen de list niet in mijn for loop.
bijv hier de for loop die ik met de struct gebruikte om de gegevens BEHALVE voorraad te laden en te laten zien:
code:
1
2
3
4
for (int i = 0; i <= mp3lijst.Count - 1; i++)
                                {
                                    Console.WriteLine(mp3lijst[i].ID + " " + mp3lijst[i].Make + "       " + mp3lijst[i].Model + "   " + mp3lijst[i].MBSize + "      " + mp3lijst[i].Price);
                                }

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Wat is "laadt niet"? Je zal toch echt moeten gaan debuggen, want de kans dat wij van een afstandje zien wat er mis is zonder de hele code te zien (en nee, ga die nou niet posten) is nihil.

Zet eens een breakpoint in je constructor na Mp3[] mp3 = { ...} en kijk wat de waarden in je mp3-array zijn. Zet dan een breakpoint waar je je lijst uitleest, en kijk wat de waarden in je lijst zijn.

Ik gok dus (en ja, daarmee spreek ik mijn eerste alinea tegen) dat je de mp3-array nog moet toevoegen aan je lijst, middels mp3lijst.AddRange(mp3);, maar iets met vissen, eten en een dag.

[ Voor 8% gewijzigd door CodeCaster op 14-06-2012 11:06 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • Sythani
  • Registratie: September 2011
  • Laatst online: 27-05-2021
Heb het gevonden, helemaal vergeten te debuggen :$
Waardes waren inderdaad leeg en was vergeten om de gegevens aan de lijst toe te voegen inderdaad.

Is nu wel gedaan :)

Acties:
  • 0 Henk 'm!

  • Joshuatree
  • Registratie: November 2002
  • Laatst online: 13-09 16:41
code:
1
2
3
4
5
6
7
8
9
10
11
12
            var mp3s = new List<Mp3>{
               new Mp3 { Id = 1, Make = "Apple1", Model = "Model1", Price = 10.00m, Storage = 1 , Voorraad = 700},
               new Mp3 { Id = 2, Make = "Apple2", Model = "Model2", Price = 10.00m, Storage = 5 , Voorraad = 700},
               new Mp3 { Id = 3, Make = "Apple3", Model = "Model3", Price = 10.00m, Storage = 15 , Voorraad = 700},
               null,
               new Mp3 { Id = 4, Make = "Apple4", Model = "Model4", Price = 10.00m, Storage = 20 , Voorraad = 700},
            };


            Action<Mp3> print = mp3print => Console.WriteLine("Id {0}, Make {1}", mp3print.Id, mp3print.Make);

            mp3s.FindAll(mp3all => mp3all != null).ForEach(print);
Pagina: 1