Gå til innhold

C# oppdatere verdi på object som er lagret i sortedlist?


Anbefalte innlegg

Hei!

 

Har en oppgave som jeg har fått på skola og trenger litt hjelp med C# jeg!

 

Har laget de forskjellige klassene utifra et UML skjema og de er som følgende:

(Tjener)

Menyskjema

Søkekjema

 

(Server)

Kontroll klasse

Abstrakt klasse Eiendom

ByEiendom (som arver Eiendom)

LandEiendom (som arver eiendom)

Etype (enumeration)

Bud klasse

 

Har i kontrollklassen en SortedList<int, Eiendom> Eiendomsliste som skal bestå av eiendom objekter.

Har fått til å lage metodene for å legge til eiendommer og fjerne eiendommer, men klarer ikke å finne noen måte å endere verdier på objekter som allerede ligger i eiendomslisten.

 

Ifølge UML skal metoden være slik:

+updateEiendom(enr: int, verditakst: int, solgt: bool): void /*andre detaljer kan ikke endres*/

Det er denne metoden jeg sliter med!

Bruker enr som er ID på eiendommene (readonly) som int for å sortere sortedlist.

 

Kan noen hjelpe meg med å endre eiendommer i sortedlist? :)

 

 

Dette er da kontroll klassen min:

 

Public class Kontroll {
//Lager en sorted list med eiendomsobjekter
Private SortedList<int,Eiendom> eiendomsliste = new SortedList<int,Eiendom>();
Public static readonly Kontroll kontroll = new Kontroll();
Private Kontroll() { }
//Leggr til ByEiendom i eiendomslisten
Public void addByEiendom(int enr, Etype etype, int verditakst, string adresse,bool solgt=false){
ByEiendom nyByEiendom = new ByEiendom(enr, etype, verditakst, solgt, adresse);
eiendomsliste.Add(enr, nyByEiendom); }
//Legger til LandEiendom i eiendomslisten
Public void addLandEiendom(int enr, Etype etype, int verditakst, string matrikkelnr, bool solgt=false) {
LandEiendom nyLandEiendom = new LandEiendom(enr, etype, verditakst, solgt, matrikkelnr);
eiendomsliste.Add(enr, nyLandEiendom);}
//Sletter eiendom i listen
Public void delEiendom(int enr){
eiendomsliste.RemoveAt(enr); }
//Her skal jeg kunne endre verdier på objekter i sortedlist
public void updateEiendom(int enr, int verditakst, bool solgt)
{
?????
"Hvordan får jeg endret verdier på objekter i sortedlist?"
}
}
Trenger all hjelp jeg kan få!
Håper noen har en løsning til meg!
Takk! :)
Endret av bjorneoen_InnleggNO
Lenke til kommentar
Videoannonse
Annonse
var item = sortedList[enr];
item.VerdiTakst = verdiTakst;
item.Solgt = solgt;

Takk!

Måtte endre item.verditakst og item.solgt til setmetodene men tror det funker! :D

 

Etter mye klundring fant jeg en annen metode som jeg tror også kanskje funker en er ikke sikker!

 

Løsning 1:

Eiendom nyEiendom = eiendomsliste[eiendomsliste.Keys[enr]];
nyEiendom.setVerditakst(verditakst);
nyEiendom.setSolgt(solgt);
Løsning 2:
var item = eiendomsliste[enr];
item.setVerditakst(verditakst);
item.setSolgt(solgt);

 

Begge disse vil fungere? Fordeler, ulemper med de to? :)

Lenke til kommentar

 

Takk!

Måtte endre item.verditakst og item.solgt til setmetodene men tror det funker! :D

 

Etter mye klundring fant jeg en annen metode som jeg tror også kanskje funker en er ikke sikker!

 

Løsning 1:

Eiendom nyEiendom = eiendomsliste[eiendomsliste.Keys[enr]];
nyEiendom.setVerditakst(verditakst);
nyEiendom.setSolgt(solgt);
Løsning 2:
var item = eiendomsliste[enr];
item.setVerditakst(verditakst);
item.setSolgt(solgt);

 

Begge disse vil fungere? Fordeler, ulemper med de to? :)

 

Den øverste løsningen er feil, da den slår opp SortedList sin nøkkel med SortedList sin nøkkel. Om du bruker var eller eksplisitt sier datatypen er bare en preferansesak. Som regel så bruker jeg var.

C# har man egen syntaks for get/set metoder:

 

 

public class Eiendom
{
   public int VerdiTakst { get; set; }
   public bool Solgt { get; set; }
}

Dette tillater også at set er private som er temmelig vanlig:

 

public class Eiendom
{
   public int VerdiTakst { get; private set; }
   public bool Solgt { get; private set; }
   public Eiendom(int verdiTakst)
   {
       VerdiTakst = verdiTakst;
   }
   public Eiendom SelgEiendom()
   {
       return new Eiendom(VerdiTakst) { Solgt = true; }      
   }
}

Du kan også ha et backing field:

 

public class Eiendom
{
   private readonly int VerdiTakst; // readonly betyr at verdien bare kan skrives til i Constructoren.
   // Merk at readonly sier ingenting om innholdet i objektet.
   private bool Solgt; // Ettersom vi skriver til denne i SelgEiendom kan den ikke være readonly.
 
   public int VerdiTakst { get { return VerdiTakst; } }
   public bool Solgt { get { return Solgt; } private set { Solgt = value; } }

   public Eiendom(int verdiTakst)
   {
       VerdiTakst = verdiTakst;
   }

   public Eiendom SelgEiendom()
   {
       return new Eiendom(VerdiTakst) { Solgt = true; }      
   }
}

Grunnen til å bruke immutable objekter (altså typer som ikke kan endres etter de er opprettet) er at objektet i seg selv er threadsafe. Men man må da også være klar over at man ikke erstatter referansen, så hvis noen har en referanse til det gamle objektet vil ikke disse bli oppdatert.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...