Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB.NET] Tvalue veranderen in dictionary(OF Tkey, Tvalue)*

Pagina: 1
Acties:
  • 448 views

  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Betreft project : zeeslag in VB.net 2008

Visual Basic .NET:
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
Class BOOT 

    Enum toestand
        gecreeerd
        gezonken
    End Enum

    Private m_bootmatrix As New Dictionary(Of Coordinate, bootonderdeel)

 Public ReadOnly Property GetBootMatrix() As Dictionary(Of Coordinate, bootonderdeel)
        Get
            Return m_bootmatrix
        End Get
    End Property

    Friend Sub bomb(ByVal tebombarderencoordinaat As Coordinate)
        Me.MarkBootonderdeelAsGetroffen(tebombarderencoordinaat)
        If CheckBootGezonken() = True Then
            Me.m_toestand = toestand.gezonken 'toestand van boot veranderen in 'gezonken'
            Me.m_ResultaatvanBomb = ResultaatVanBomb.gezonken 'boot gezonken
        Else
            Me.m_ResultaatvanBomb = ResultaatVanBomb.raak
        End If
    end sub

    Private Sub MarkBootonderdeelAsGetroffen(ByVal getroffencoordinaat As Coordinate)
        Me.GetBootMatrix.Item(getroffencoordinaat) = bootonderdeel.getroffen 
    End Sub
End CLASS


Vraag : hoe kan ik de bijhorende value van een key in een dictionary (of Tkey, Tvalue) veranderen ??

Heb ik reeds geprobeerd :
1. Me.GetBootMatrix.Item(getroffencoordinaat) = bootonderdeel.getroffen
' dus gewoon value opnieuw setten
2. Me.GetBootMatrix.Remove(tebombarderencoordinaat)
Me.GetBootMatrix.Add(tebombarderencoordinaat, bootonderdeel.getroffen)
' dus element verwijderen en terug toevoegen met correcte toestand

Wat ik wil is dus dat wanneer de boot de coördinaat bevat, deze als getroffen wordt gemarkeerd. Standaard is elk bootonderdeel 'intact'...
Hoe wijzig ik deze value ?

  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Wat ik vergat te vermelden :

de oplossingen die ik reeds geprobeerd heb, werken niet !
Wat er gebeurt is dat er een extra element(Tkey,Tvalue) wordt toegevoegd !
Op deze manier kan mijn boot nooit de toestand 'gezonken' verkrijgen...

Ik zit er mij suf op de kijken !!!

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:06
Wat je ook vergeten bent:
- code tags
- vermelden over welke taal het gaat in je topic-titel
- de edit knop gebruiken als je iets vergeten bent

Dus, als je even code-tags kunt toevoegen ... Normaal gezien zouden beide oplossing die je geprobeerd hebt, het beoogde resultaat moeten bereiken.
Alleen zie ik dat je de ene keer 'getroffencoordinaat', en de andere 'tebombarderencoordinaat' gebruikt.

Heb je trouwens al eens je code gedebugged ipv je er 'suf te zitten op kijken ' ?

https://fgheysels.github.io/


  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Debuggen : jep, code lijn per lijn laten uitvoeren en constateren dat ipv de value van een key te veranderen of een element uit de dictionary te verwijderen, er een element aan mijn dictionary wordt toegevoegd...

Ik heb ook al in de objectbrowser van Visual Studio erop nagelezen wat de method .remove en .item zouden moeten doen, maar dat is niet wat er bij mij gebeurd...

Tebombarderencoordinaat , getroffencoordinaat zijn maar namen van argumenten...

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-11 23:16

TeeDee

CQB 241

Zo even heel gauw:

Je hebt een ReadOnly Property. Waar denk je dat die ReadOnly voor staat?
Te gauw ;)

[ Voor 9% gewijzigd door TeeDee op 22-05-2008 17:11 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Betreft gewoon een functie (of dus readonly property) die mijn dictionary oplevert.
Tenslotte is mijn veld 'private', en mijn method public.
Wil nog niet zeggen dat ik daar niet alle members van een dictionary kan op aanspreken, ook members die de dictionary gaan aanpassen.

Verklaart nog steeds niet waarom er elementen aan de dictionary worden toegevoegd ?
Volgens jouw redenering zou dit zelfs niet mogen gebeuren...

Feit is nog steeds dat ipv een element aan te passen of te verwijderen, er gewoon een element aan wordt toegevoegd en dit gebeurt na het uitvoeren van de procedure 'MarkBootonderdeelAsGetroffen'.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14:04
Heeft de class die je als key gebruikt Equals en GetHashCode wel jusit geimplementeerd?

Roomba E5 te koop


  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Visual Basic .NET:
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
Class Coordinate
    Private m_rijnr As Integer
    Public Property rijnr() As Integer
        Get
            rijnr = m_rijnr
        End Get
        Set(ByVal value As Integer)
            m_rijnr = value
        End Set
    End Property
    Private m_kolomnr As Integer
    Public Property kolomnr() As Integer
        Get
            kolomnr = m_kolomnr
        End Get
        Set(ByVal value As Integer)
            m_kolomnr = value
        End Set
    End Property
    Public Overrides Function Equals(ByVal obj As Object) As Boolean
        If TypeOf obj Is Coordinate Then
            Dim other As Coordinate = DirectCast(obj, Coordinate)
            Equals = Me.rijnr = other.rijnr AndAlso Me.kolomnr = other.kolomnr
        End If
    End Function
End Class

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 18-11 23:16

TeeDee

CQB 241

pssst, gebruik eens codetags [code=vb.net] ... [/code], dat leest makkelijker.

[ Voor 4% gewijzigd door TeeDee op 22-05-2008 17:18 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14:04
Sorry je code is zo niet te lezen (zie commentaar van whoami), ik ga dus ook geen poging doen.

Roomba E5 te koop


  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 01-07-2023
Dictionary(of TKey, TValue) gebruikt ook de hashcode en niet alleen de Equals, overschrijf dus ook de GetHashcode methode.

Zie ook: http://msdn.microsoft.com/en-us/library/ms182358(VS.80).aspx

  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Kheb in mijn lessen vb.net nog niks gezien over Hashing Codes jammer genoeg...

Zien jullie een andere methode om aan eenzelfde resultaat te komen ?

Ik dacht om binnen mijn method 'MarkBootonderdeelAsGetroffen' een nieuwe dictionary te creëren met alle reeds aanwezige elementen, behalve diegene die dient gewijzigd te worden.
En dan in een 2de stap de te wijzigen coordinaat toevoegen met zijn value...
Deze nieuw gecreëerde dictionary overschrijft dan de oude...

Mooi is het niet, nee...

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 14:04
Heb je gelezen wat er in de link van Serpie staat?

Roomba E5 te koop


  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Ja ma ksnap er niet veel van...
Wat doet een hashcode eigenlijk ?
En dit is C#...

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12:55

Janoz

Moderator Devschuur®

!litemod

Dat het C# is is irrelevant. Zoals je op die pagina hebt kunnen lezen staat daar letterlijk dat je niet alleen een equals moet implementeren, maar ook een GetHashCode. Waarvoor die hashcode vervolgens gebruikt wordt wordt neem ik aan ook wel in de documentatie uitgelegd.

In het kort komt het er op neer dat objecten die hetzelfde zijn (waarvoor de equals true oplevert dus) ook dezelfde hashcode op moeten leveren. Bij jouw Coordinaat class is dat dus niet het geval. Hierdoor kun jij wel vinden dat twee coordinaten gelijk zijn, maar zolang de hashcodes verschillend zijn zal je programma ze als verschillende coordinaten behandelen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:06
Een hashtable / dictionary en consoorten gebruiken de hashcode van een object om te bepalen of het object zich al in de lijst bevind of niet ....
In de documentatie staat er idd ook dat, als je Equals override, je ook GetHashcode moet overriden en vice versa.

https://fgheysels.github.io/


  • jonaskellens
  • Registratie: November 2006
  • Laatst online: 30-05-2011
Visual Basic .NET:
1
2
3
4
5
Public Sub bomb(ByVal tebombarderencoordinaat As Coordinate, ByVal vlootcpu As ZeeslagClassLibrary.vloot)
        If Me.GetReedsBeschotenCoordinaten.ContainsKey(tebombarderencoordinaat) Then   'check coordinaat reeds op afgevuurd
            Me.m_GeefResultaatVanBomb = ResultaatVanBomb.reeds_afgevuurd   'coordinaat reeds afgevuurd
        Else
...


Wanneer ik 2maal dezelfde coördinaat doorgeef via mijn Client-applicatie (console) zou ik normaal gezien de melding moeten krijgen dat de coördinaat reeds beschoten is.
Echter Me.GetReedsBeschotenCoordinaten.ContainsKey(tebombarderencoordinaat) evalueert naar 'False' !
Terwijl het dus zou moeten evalueren naar True ! Want 2 maal dezelfde coördinaat !

Zit hier ook die hashcode voor iets tussen ?

Bedankt voor je hulp Whoami

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:06
Kijk, als je nu eens de documentatie (MSDN) zou lezen, de posts hier begrijpend zou lezen, dan zou je al heel wat verder komen ....
Ik denk dat het geen zin meer heeft om nog veel energie in dit topic te stoppen; neem de doc's door, probeer het uit, en zie ....

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.