Avatar billede gurvic Nybegynder
13. januar 2007 - 23:57 Der er 9 kommentarer og
1 løsning

arraylist af objekter

sidste spørgsmål herfra idag ;)
Jeg har en arraylist som indeholder en rækker objekter af typen vare. Vare: vareNr, vareAntal...
Hvis jeg skal tjekke om mit array indeholder et object hvor vareNr er sat til TempVareNr, hvordan gør jeg så det? og hvordan opdaterer jeg det? altså hvis den findes så skal den lægge 1 til.
Avatar billede arne_v Ekspert
14. januar 2007 - 00:10 #1
en ArrayList har faktisk en Contains metode som kan bruges til det (hvis
de objekter man leder efter har en passende Equals og GetHashCode metode.
Avatar billede skov_p Praktikant
14. januar 2007 - 00:16 #2
ArrayList varer;

private void addItem(string itemNo){
bool itemFound = false;
for(int i=0;i<varer.Count;i++){
if(varer[i].vareNr.Equals(tmpVareNr)){
varer[i].vareAntal++;
itemFound = true;
}
}
if(!itemFound)
varer.Add(varen med det valgte varenummer);
}
Avatar billede skov_p Praktikant
14. januar 2007 - 00:18 #3
Hov... sådan

private void addItem(string itemNo){
bool itemFound = false;
for(int i=0;i<varer.Count;i++){
if(varer[i].vareNr.Equals(itemNo)){
varer[i].vareAntal++;
itemFound = true;
}
}
if(!itemFound)
varer.Add(varen med det valgte varenummer);
}
Avatar billede arne_v Ekspert
14. januar 2007 - 00:23 #4
i .NET 2.0 har List<> nogle rigtigt smarte metoder til det som vil være langt bedre
end ArrayList
Avatar billede gurvic Nybegynder
14. januar 2007 - 21:32 #5
skov_p >får denne fejl 'object' does not contain a definition VareNr når jeg prøver din kode
arne_v>hender godt Equals, det jeg mangler er helt konkret hvordan jeg henviser til lige nøjagtig den property i mit array. Altså varer[i].VareNr men det virker så ikke lige.
Avatar billede gurvic Nybegynder
14. januar 2007 - 21:33 #6
arne_v: ja kunne godt være jeg skulle få sat mig grundig ind i 2.0, kan se der er mange muligheder jeg ikke bruger. Har en slem tendens til at gøre det mere besværligt for mig selv, end det behøver. Men det kommer vel med øvelsen.
Avatar billede skov_p Praktikant
14. januar 2007 - 21:44 #7
Sorry vi skal jo lige have fortalt at objekterne er af typen Vare.
Med As keyword bliver objectet betragtet som den type angivet efter As

private void addItem(string itemNo){
bool itemFound = false;
for(int i=0;i<varer.Count;i++){
if((varer[i] as Vare).vareNr.Equals(itemNo)){
(varer[i] as Vare).vareAntal++;
itemFound = true;
}
}
if(!itemFound)
varer.Add(varen med det valgte varenummer);
}
Avatar billede arne_v Ekspert
14. januar 2007 - 21:59 #8
eksempel med Equals:

using System;
using System.Collections;

namespace E
{
    public class Vare
    {
        private int varenr;
        private string varenavn;
        private int vareantal;
        public Vare() : this(0, "", 0)
        {
        }
        public Vare(int varenr, string varenavn, int vareantal)
        {
            this.varenr = varenr;
            this.varenavn = varenavn;
            this.vareantal = vareantal;
        }
        public int Varenr
        {
            get
            {
                return varenr;
            }
            set
            {
                varenr = value;
            }
        }
        public string Varenavn
        {
            get
            {
                return varenavn;
            }
            set
            {
                varenavn = value;
            }
        }
        public int Vareantal
        {
            get
            {
                return vareantal;
            }
            set
            {
                vareantal = value;
            }
        }
        public override String ToString()
        {
            return "(" + varenr + "," + varenavn + "," + vareantal + ")";
        }
        public override bool Equals(object o)
        {
            if (o is Vare)
            {
                if (Varenr == ((Vare)o).Varenr)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        public override int GetHashCode()
        {
            return varenr.GetHashCode();
        }
    }
    public class VareList
    {
        private ArrayList varer;
        public VareList()
        {
            varer = new ArrayList();
        }
        public void Add(Vare v)
        {
            int ix = varer.IndexOf(v);
            if(ix >= 0)
            {
                ((Vare)varer[ix]).Vareantal += v.Vareantal;
            }
            else
            {
                varer.Add(v);
            }
        }
        public void Print()
        {
            foreach(Vare v in varer)
            {
                Console.WriteLine(v);
            }
        }
    }
    public class MainClass
    {
        public static void Main(string[] args)
        {
            VareList varer = new VareList();
            varer.Add(new Vare(1001, "A", 1));
            varer.Add(new Vare(1002, "B", 2));
            varer.Add(new Vare(1003, "C", 3));
            varer.Print();
            varer.Add(new Vare(1002, "B", 10));
            varer.Add(new Vare(1001, "A", 1));
            varer.Add(new Vare(1004, "D", 4));
            varer.Print();
        }
    }
}
Avatar billede arne_v Ekspert
14. januar 2007 - 22:05 #9
og med .NET 2.0 predicate:

using System;
using System.Collections.Generic;

namespace E
{
    public class Vare
    {
        private int varenr;
        private string varenavn;
        private int vareantal;
        public Vare() : this(0, "", 0)
        {
        }
        public Vare(int varenr, string varenavn, int vareantal)
        {
            this.varenr = varenr;
            this.varenavn = varenavn;
            this.vareantal = vareantal;
        }
        public int Varenr
        {
            get
            {
                return varenr;
            }
            set
            {
                varenr = value;
            }
        }
        public string Varenavn
        {
            get
            {
                return varenavn;
            }
            set
            {
                varenavn = value;
            }
        }
        public int Vareantal
        {
            get
            {
                return vareantal;
            }
            set
            {
                vareantal = value;
            }
        }
        public override String ToString()
        {
            return "(" + varenr + "," + varenavn + "," + vareantal + ")";
        }
        public bool SameVarenr(Vare v)
        {
            return Varenr == v.Varenr;
        }
    }
    public class VareList
    {
        private List<Vare> varer;
        public VareList()
        {
            varer = new List<Vare>();
        }
        public void Add(Vare v)
        {
            int ix = varer.FindIndex(v.SameVarenr);
            if(ix >= 0)
            {
                varer[ix].Vareantal += v.Vareantal;
            }
            else
            {
                varer.Add(v);
            }
        }
        public void Print()
        {
            foreach(Vare v in varer)
            {
                Console.WriteLine(v);
            }
        }
    }
    public class MainClass
    {
        public static void Main(string[] args)
        {
            VareList varer = new VareList();
            varer.Add(new Vare(1001, "A", 1));
            varer.Add(new Vare(1002, "B", 2));
            varer.Add(new Vare(1003, "C", 3));
            varer.Print();
            varer.Add(new Vare(1002, "B", 10));
            varer.Add(new Vare(1001, "A", 1));
            varer.Add(new Vare(1004, "D", 4));
            varer.Print();
            Console.ReadLine();
        }
    }
}
Avatar billede gurvic Nybegynder
23. januar 2007 - 21:56 #10
Ser sq smart ud arne_v det må jeg give dig. Er endelig færdig med mit projekt, så nu må jeg vist få sat mig grundigt ind i 2.0, så mange tak.
Spørgsmålet her, var det det skov_p svarede som jeg efterlyste. Så tak for 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