Namen eines dictionary auslesen

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von freelancer.

    Namen eines dictionary auslesen

    Hallo,

    bei der Übergabe eines dictionary in eine Subroutine würde ich gern den Namen des übergebenen dictionary wissen/kennen. Geht das vielleicht über ein Directcast? Und wenn ja, wie?

    Hier meine Subroutine:

    VB.NET-Quellcode

    1. Public Sub CheckNestedDictionary(Dictionaryname As Dictionary(Of String, Dictionary(Of String, String)))
    2. Logging("list nested dictionary: " & dictionaryName)
    3. For Each pair In Dictionaryname
    4. Logging(vbTab & pair.Key)
    5. For Each subpair In pair.Value
    6. Logging(vbTab & vbTab & "'" & subpair.Key & "' = '" & subpair.Value & "'")
    7. Next
    8. Next
    9. End Sub


    In Zeile 2 soll dictionaryName nun den Namen des übergbenen dictionary enthalten ;)

    freelancer schrieb:

    bei der Übergabe eines dictionary in eine Subroutine
    verwendest Du am besten IO.Directoryinfo:

    VB.NET-Quellcode

    1. Dim di = New IO.Directoryinfo("C:\Temp\")
    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!
    So ist das nicht möglich.
    Du könntest dir jedoch eine eigene Klasse bauen, welche eine Name- und eine Dictionary-Property hat.
    Dann übergibst du diese Klasse der Prozedur und kannst die Name-Prpoperty auslesen und dein Dictionary durchlaufen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hier mal ein Beispiel:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim deinDictionary As New Dictionary(Of String, Dictionary(Of String, String))()
    4. Dim dict As New NamedDictionary("DeinName", deinDictionary)
    5. End Sub
    6. Public Sub CheckNestedDictionary(dict As NamedDictionary)
    7. Debug.Print("list nested dictionary: " & dict.Name)
    8. For Each pair In dict.Dictionary
    9. Debug.Print(vbTab & pair.Key)
    10. For Each subpair In pair.Value
    11. Debug.Print(vbTab & vbTab & "'" & subpair.Key & "' = '" & subpair.Value & "'")
    12. Next
    13. Next
    14. End Sub
    15. End Class
    16. Public Class NamedDictionary
    17. Private _Name As String
    18. Public ReadOnly Property Name As String
    19. Get
    20. Return _Name
    21. End Get
    22. End Property
    23. Public Property Dictionary As Dictionary(Of String, Dictionary(Of String, String))
    24. Public Sub New(name As String, dictionary As Dictionary(Of String, Dictionary(Of String, String)))
    25. Me._Name = name
    26. Me.Dictionary = dictionary
    27. End Sub
    28. End Class


    Natürlich könnte man das Ganze auch generisch erstellen, jedoch denke ich reicht dies mal für dein Vorhaben.

    Les dazu ein Buch darüber (microsoft-press.de/url.asp?cnt=mspress_vb2010 -> gratis Stoff)
    Hast das durch, verstehst auch was das mit den Klassen auf sich hat.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    freelancer schrieb:

    dictionary
    Mein Fehler. :whistling:
    Was genau hast Du vor?
    Würde Dir ggf. dies genügen?

    VB.NET-Quellcode

    1. Dim ll = New List(Of Tuple(Of String, String))
    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!
    Danke fichz,

    Dein Code sieht verständlich aus: also das Erstellen der Klasse, dann der Properties dafür.

    Ich bin gerade erst dabei das Buch "Einstieg in Visual Basic 2013" durchzuarbeiten. Ein Buch für Entwickler werde ich dann zu gegebener Zeit lesen :)
    Der Begriff "Name" ist unklar. Zunächstmal: ein Dictionary hat keinen Namen.

    Variablen haben Namen, und einer Variablen kann man ein Dictionary zuweisen.
    Aber die Namen der Variablen existieren nur im Code-Editor.

    Im laufenden Programm existieren diese Namen nicht, sondern da agiert das, was im Code durch diese Namen bezeichnet wurde.

    Von daher ergibt deine Frage überhaupt keinen Sinn - also Gegenfrage: Was eiglich willst du erreichen?
    Also, das Ziel ist folgendes:

    ich möchte den Inhalt eines dictionary mitprotokollieren (zur Fehlerbehandlung). Dabei Übergebe ich der Routine das dictionary. Da es sich immer wieder um unterschiedliche dictionary handeln kann, welche ich über diese Routine laufen lasse, würde ich gern den Namen des dictionary mit in die Protokollierung übernehmen (Zeile 2).

    Ich hatte mir schon gedacht, dass ein dictionary kein Attribut "Name" hat. Am Einfachsten könnte ich den Aufruf so ändern, dass ich den Namen des dictionary noch mit als Variable übergebe:

    VB.NET-Quellcode

    1. Public Sub CheckNestedDictionary(ByVal Name As String, Dictionaryname As Dictionary(Of String, Dictionary(Of String, String)))
    2. Logging("list nested dictionary: " & Name)
    3. For Each pair In Dictionaryname
    4. Logging(vbTab & pair.Key)
    5. For Each subpair In pair.Value
    6. Logging(vbTab & vbTab & "'" & subpair.Key & "' = '" & subpair.Value & "'")
    7. Next
    8. Next
    9. End Sub


    ;)
    jo, das wäre eine Möglichkeit.
    Oder halt so wie Fichz es vormacht - dass du spezielle Dictionaries dafür verwendest, die dann halt eine Name-Property haben.

    Deine Benamung ist übrigens erschreckend furchtbar: Die Methode checkt nix, sondern sie loggt. Dictionaryname ist kein Name, sondern ist ein Dictionary. Und Name kann ja jeder beliebige Text sein, da würde sich also "text" als Parameter-Name besser eignen.

    was auch gut wäre, wenn du den vb6-Mist aus deinem VisualStudio verbannen tätest: Böse Funktionen vermeiden oder auch gleich Visual Studio - Empfohlene Einstellungen
    Gesagt, getan:

    VB.NET-Quellcode

    1. Public Sub LoggingNestedDictionary(ByVal text As String, Dictionary As Dictionary(Of String, Dictionary(Of String, String)))
    2. Logging("list nested dictionary: " & text)
    3. For Each pair In Dictionary
    4. Logging(vbTab & pair.Key)
    5. For Each subpair In pair.Value
    6. Logging(vbTab & vbTab & "'" & subpair.Key & "' = '" & subpair.Value & "'")
    7. Next
    8. Next
    9. End Sub
    @freelancer Jou.
    Probier mal diesen:

    VB.NET-Quellcode

    1. Logging(String.Format("{2}{2}'{0}' = '{1}'", subpair.Key, subpair.Value, ControlChars.Tab))
    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:


    VB.NET-Quellcode

    1. Logging(String.Format("{2}{2}'{0}' = '{1}'", subpair.Key, subpair.Value, ControlChars.Tab))


    Läuft. Danke.

    Da muss ich doch glatt nochmal durch meinen Code und diese Sachen anpassen ;)
    Die "Herausnahme" des VisualBasic Namespaces bringt 85 Fehler hervor. Da muss ich mich sicherlich langsam herantasten, da ich nicht weiß, durch welche Funktionen oder Kommandos ich den Namespace ersetzen kann. Das kann ich also nur step-by-step machen ......

    freelancer schrieb:

    85 Fehler
    Poste mal das Projekt.
    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!

    freelancer schrieb:

    was meinst Du
    Bereinige Dein Projekt, packe das ganze in ein ZIP und hänge dies als Dateianhang an einen Post.
    Erweiterte Antwort => Dateianhänge => Hochladen
    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!
    Damit is gemeint, dass du in Visual Studio unter Build auf Clean Solution gehst, oder Clean <DeinProjektName>.
    Leider kenne ich den deutschen Namen für Build nicht, Erstellen? Bauen?
    Und in dem Menü dann eben auf Bereinige Lösung oder Bereinige <DeinProjektName>

    Alternativ auch im Solution Explorer nen Rechtsklick auf das Projekt machen.