Dictionary dynamisch ansprechen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Dictionary dynamisch ansprechen

    Hallo ich bin gerade in .net auf ein Problem gestossen und hoffe das jemand Rat weiß.

    Ich
    habe mir einige Dictionarys vom typ string, string gebaut (etwa 20) und
    sie zum besseren erkennen mit dem tag Dict vor dem Namen versehen.
    Bsp.:
    DictAAA DictBBB DictCCC etc. In einer Listview werden nun Einträge
    gesammelt die man aus checkboxen angeklickt hat. Soweit so gut.

    Jetzt
    würde ich gerne die Liste der Listview abarbeiten und mit jedem Eintrag
    ein Dictionary ansprechen. Die Einträge im Listview haben bis auf den
    TAG
    "Dict" den selben Namen wie die Dictionarys selber. Aber ich
    glaube das Problem ist, dass ich aus einem String, selbst wenn er den
    Namen des Dictionarys hat,
    nicht auf selbiges zugreifen kann. Kann ich das irgendwie bewerkstelligen?

    Klar
    ich könnte nun 20 select Case abfragen machen, aber ich wollte das nach
    Möglichkeit, und gerade wenn es evtl. später mehr Dic´s werden,
    dynamisch machen.

    Ich weiß wie ich Dict´s abfrage und auch die
    Listview items bzw den .text bekomme. Aber nicht, wie ich (und zur Not
    mit irgendwelchen Tricks), mit dem Namen an das passende Dictionary
    komme.
    Das hier geht leider nicht, wäre ja auch zu schön

    For each p as keyvaluepair (of string, string) in Dict("variablerstring")
    ...
    next
    Hallo,
    wofür um Himmels willen braucht man 20 Dictionaries, die auch noch die gleichen Typen speichern? Das klingt für mich nach einem grundlegenden "Problem".
    Aber gut, es gibt hier aber sicherlich mehrere Ansätze, wie sich das bewerkstelligen lässt. Hier ein recht simpler Vorschlag: Du verwendest einfach nur ein Dictionary und deinen Key erweiterst du um ein "Gruppierungskennzeichen".

    VB.NET-Quellcode

    1. Dim dictionaryKey As String = $"{dictionaryGroup}-Value-A"

    Dabei würde "dictionaryGroup" den z.B. Wert AAA, BBB, CCC usw. aus dem gewählten Eintrag deiner ListView bekommen.

    ISliceUrPanties schrieb:

    wofür um Himmels willen braucht man 20 Dictionaries, die auch noch die gleichen Typen speichern? Das klingt für mich nach einem grundlegenden "Problem".


    Es geht darum das dort Verscheidene Artikel bzw deren Beschreibung gespeichert werden. So müsste ich, nur noch p.key bzw p.value herranziehen und hätte den ganzen string dort eingetragen wo er hin soll. Denn so oder so irgendwo muss der Text im Programm gespeichert werden, und diese Variante hielt ich für besser als damit die My.Settings voll zu hauen.

    nach deinem Beispiel müsste ich dann folgendes machen?

    for each p as keyvaluepair (of string, string) in dictionaryGroup

    Denn es geht mir nicht darum das dict zu füllen, die sind schon voll. Es geht mir nur darum (zumindest aktuell, bis ich eine bessere Variante habe) dynamisch ein Dict anzusprechen um dann dessen key bzw Value zu bekommen um mit diesem weiter zu arbeiten.
    Du könntest deine Dictionaries in ein Dictionary(of String, Dictionary(Of String, String)) packen. und etwa so ansprechen.

    VB.NET-Quellcode

    1. Dim DictAAA As New Dictionary(Of String, String)
    2. Dim DictBBB As New Dictionary(Of String, String)
    3. Dim DictCCC As New Dictionary(Of String, String)
    4. Dim DictDDD As New Dictionary(Of String, String)
    5. Dim dictionaryGroup As New Dictionary(Of String, Dictionary(Of String, String))
    6. dictionaryGroup.Add("AAA", DictAAA)
    7. dictionaryGroup.Add("BBB", DictBBB)
    8. dictionaryGroup.Add("CCC", DictCCC)
    9. dictionaryGroup.Add("DDD", DictDDD)
    10. Dim NameOfDict As String = "AAA"
    11. For Each p As KeyValuePair(Of String, String) In dictionaryGroup(NameOfDict)
    12. Next
    Evtl. hab ich das Problem nicht verstanden. Aber das ganze hört sich sehr nach Workaround des Workarounds an. Liese sich objektorientiert sehr einfach lösen:

    1. Umsteigen auf DataGridView statt ListView
    2. Klasse Artikel mit passenden Properties (z.B. Artikelnummer und Property Beschreibung) erstellen
    3. List(Of Artikel) erzeugen und alle Artikel dort hinzufügen
    4. Diese Liste dem DataGridView als Datenquelle übergeben
    5. wenn man nun im DataGridView ändert, bleibt die Datenquelle automatisch immer synchron
    "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

    mrMo schrieb:

    Aber das ganze hört sich sehr nach Workaround des Workarounds an. Liese sich objektorientiert sehr einfach lösen
    Ich hatte ähnliche Gedankengänge, hielt mich dann aber zurück, weil ich das Gefühl hatte, dass der TE einem objektorientierten Ansatz (noch) nicht folgen kann.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --