Dictionary - String kann nicht in System.Collection.Generic.KeyValuePair..... konvertiert werden

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Dictionary - String kann nicht in System.Collection.Generic.KeyValuePair..... konvertiert werden

    Moin!

    ich möchte eine Datenstruktur speichern.

    Es gibt einen Namen und dazu gehören dann eine Vielzahl von Daten die über Name -> Wert definiert werden.

    Ich hatte mir hierzu folgendes überlegt:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' prüfen, ob eine Layername bereits im Status vorhanden
    3. ''' </summary>
    4. ''' <param name="LayerName">zu prüfender Layername</param>
    5. ''' <returns>true ... vorhanden / false ... nicht vorhanden</returns>
    6. Public Function Exists(LayerName As String)
    7. If Me.LayerStatus.Contains(LayerName.ToUpper) = True Then
    8. Return True
    9. End If
    10. Return False
    11. End Function


    bekomme aber folgende Meldung:


    Der Wert vom Typ "String" kann nicht in "System.Collections.Generic.KeyValuePair(Of String, System.Collections.Generic.Dictionary(Of String, Boolean))" konvertiert werden.


    Kann mir einer weiterhelfen bei der Suche nach meinem Gedankenfehler?

    Gruß Jan
    Moin!

    also meine Daten sollen mal abstarkt so aussehen

    Variante 1 -> ("Layer1" -> on, "Layer2" -> off, "Layer3" -> off, "Layer4" -> on, "Layer5" -> on, "Layer6" -> on)
    Variante 2 -> ("Layer1" -> off, "Layer2" -> off, "Layer3" -> on, "Layer4" -> on, "Layer5" -> on, "Layer6" -> on)
    Variante 3 -> ("Layer1" -> on, "Layer2" -> on, "Layer3" -> off, "Layer4" -> on, "Layer5" -> on, "Layer6" -> on)
    ...

    was würdest Du dann vorschlagen?

    Gruß Jan
    @jan99 KeyValuePait(Of String, Boolean) heißt nix anderes, als dass Du ein Wertepaar hast, das aus einem String und einem Bool besteht.
    Die packst Du in eine List(Of T).
    Beim Hinzufügen eines Items zu dieser Liste musst Du ein New KeyValuePait(Of String, Boolean)("Layer42, True) machen, und beim Auslesen eines Items den Key vorgeben und den Value abgreifen.
    Wenn die "Layers" alle verschieden sind, nimm ein Dictionary(Of String, Boolean), das sorgt allein für nur verschiedene Keys.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi !

    ich glaube mir das der Name Variante etwas verwirrend gewählt war. Das sollen schon Bezeichnungen sein.

    Deshalb nochmal mit anderen Namen.

    "Bauleitplanung" -> ("Layer1" -> on, "Layer2" -> off, "Layer3" -> off, "Layer4" -> on, "Layer5" -> on, "Layer6" -> on)
    "Versorger" -> ("Layer1" -> off, "Layer2" -> off, "Layer3" -> on, "Layer4" -> on, "Layer5" -> on, "Layer6" -> on)
    "Entsorger" -> ("Layer1" -> on, "Layer2" -> on, "Layer3" -> off, "Layer4" -> on, "Layer5" -> on, "Layer6" -> on)
    ...


    Gruß Jan
    Schreib dir doch ne Klasse welche die ganzen Layer enthält.

    Dann im Dictionary sowas Dictionary Of(String, T)

    String wäre dann die Bezeichnung als Key und T (deine Klasse) der Value
    So bekommst du über die Bezeichnung das Objekt zurück mit den benötigten Werten.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @jan99 Dann legst Du 3 Lists / Dictionaries an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    mrMo schrieb:

    Schreib dir doch ne Klasse welche die ganzen Layer enthält.

    Dann im Dictionary sowas Dictionary Of(String, T)

    String wäre dann die Bezeichnung als Key und T (deine Klasse) der Value
    So bekommst du über die Bezeichnung das Objekt zurück mit den benötigten Werten.



    Danke für Tipp - es ist genau der Grund warumich erst so spät mit Kassen angefangen habe.

    Manchmal fehlt mir die Vorstellung, wie in diesem Fall, wie soetwas auszusehen hat!

    Jan

    jan99 schrieb:

    und was machst Du
    Einen anständigen Plan. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    jan99 schrieb:

    und was machst Du
    Einen anständigen Plan. ;)


    Einen Plan hatte ich ja mit dem verschachtelten Dict - aber weiter weiß ich nicht an dieser Stelle und deshalb sende ich ja mein SOS.

    Gruß Jan

    Glaube meinen Fehler oben gefunden zu haben aus

    VB.NET-Quellcode

    1. If Me.LayerStatus.Contains(LayerName.ToUpper) = True Then

    muss

    VB.NET-Quellcode

    1. If Me.LayerStatus.ContainsKey(LayerName.ToUpper) = True Then


    werden.


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „jan99“ ()

    jan99 schrieb:

    Einen Plan hatte ich ja mit dem verschachtelten Dict
    Fang an mit einer vollständigen und belastbaren Aufgabenstellung / Problembeschreibung.
    Eine solche verbietet eine derartige Nachforderung:
    und was machst Du wenn es heute 10 sind und übermorgen 20?
    denn da ist diese Zahl wohl definiert.
    Falls die exakte Zahl unbekannt ist, wird eine obere Schranke angegeben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    jan99 schrieb:

    Public Function Exists(LayerName As String)
    If Me.LayerStatus.Contains(LayerName.ToUpper) = True Then
    Return True
    End If
    Return False
    End Function

    Hast du jemals darüber nachgedacht, auf Option Strict On umzustellen?
    Und Booleans nicht mit True und False zu doppel-vergleichen?

    VB.NET-Quellcode

    1. Public Function Exists(LayerName As String) As Boolean
    2. Return LayerStatus.ContainsKey(LayerName.ToUpper)
    3. End Function
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --