Dictionary in Array

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von vbBeginner.

    Dictionary in Array

    Hallo,

    ich müsste Dictionarys die in einer Schleife befüllt werden zu einem Array hinzufügen.
    Ich hätte dies mit einer Schleife innerhalb einer zweiten Schleife versucht.
    Leider werden jedoch nicht die Werte gespeicher. Gibt es für Dictionarys sowas wie eine .copy Funktion?
    Bzw wie könnte ich mein Vorhaben sonst realisieren?
    Hier mein versuch:

    VB.NET-Quellcode

    1. Dim ArtikelArray As New ArrayList
    2. Dim Artikelanzahl As Integer
    3. Dim ArtikelZeile As Excel.Range
    4. Dim Artikelrange As Excel.Range
    5. Dim DiArtikel As New Dictionary(Of String, String)
    6. Artikelanzahl = exApp.Range("A22", exApp.Range("A1").End(XlDirection.xlDown)).Count
    7. Artikelrange = exApp.Range("A22", "A" & Artikelanzahl + 21)
    8. For Each ArtZeile As Excel.Range In Artikelrange
    9. ArtikelZeile = exApp.Range("A" & ArtZeile.Row, "QZ" & ArtZeile.Row)
    10. For Each Art As Excel.Range In ArtikelZeile
    11. DiArtikel.Add(CStr(exApp.Range(exApp.Cells(4, Art.Column), exApp.Cells(4, Art.Column)).Text), CStr(Art.Text))
    12. Next
    13. ArtikelArray.Add(DiArtikel)
    14. Next

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „vbBeginner“ ()

    vbBeginner schrieb:

    ich müsste ein Dictionarys die in einer Schleife befüllt werden zu einem Array hinzufügen.

    Wat?
    zu einem Array kannst du nix hinzufügen, schon garnet "ein dictionary, die befüllt werden" - weil da weiss man garnet, ob das ein dictionary ist oder mehrer.

    Gut wäre auch, wenn du deinen Code lesbar layouten tätest (Leerzeilen entfernen, Einrückungen, Kopf- und Fußzeile der Methode). Vlt. verstünde man dann bischen besser.
    Habe mich bemüht alles auszubessern.
    Der Code wie oben funktioniert soweit auch.
    Nur leider habe ich dann alle Dictionarys in dem Array mit den gleichen Daten (da es das gleiche ist und keine Kopie).
    Demnach meine Frage ob ich eine Kopie des Dictionary erstellen kann um es in das Array zu packen.

    vbBeginner schrieb:

    Nur leider habe ich dann alle Dictionarys in dem Array mit den gleichen Daten (da es das gleiche ist und keine Kopie).
    das ist klar, wenn man dein Code nu anguckt.
    Nur in zeile#5 wird ein Dictionary erstellt, nur einmal.

    Ein und demselben Dictionary wird also in #13 die strings zugefügt, und ein und dasselbe Dictionary wird in #15 in die Arraylist gepackt. Dann mag es wohl so 20 mal darinnen sein - dasselbe Dictionary.

    Tipp: Wenn du mehrere verschiedene Dictionaries erstellen könntest, dann könntest du acuh auch verschiedene Dics in die Arraylist pacekn.
    Oder ums vorzusagen: Verschiebe #5 nach #11.

    Wenn das funzt, könnte man noch mehr zum Code sagen, denn er ist recht grausig.
    erstmal gib der Sub einen Namen.
    Darfst du hier auch posten - ich zB mag ganze Methoden am liebsten:

    VB.NET-Quellcode

    1. Private Sub KomischeSub()
    2. Dim ArtikelArray As New List(Of Dictionary(Of String, String))
    3. Dim Artikelanzahl As Integer = exApp.Range("A22", exApp.Range("A1").End(XlDirection.xlDown)).Count
    4. Dim Artikelrange As Excel.Range = exApp.Range("A22", "A" & Artikelanzahl + 21)
    5. For Each ArtZeile As Excel.Range In Artikelrange
    6. Dim DiArtikel As New Dictionary(Of String, String)
    7. Dim ArtikelZeile As Excel.Range = exApp.Range("A" & ArtZeile.Row, "QZ" & ArtZeile.Row)
    8. For Each Art As Excel.Range In ArtikelZeile
    9. DiArtikel.Add(CStr(exApp.Range(exApp.Cells(4, Art.Column), exApp.Cells(4, Art.Column)).Text), CStr(Art.Text))
    10. Next
    11. ArtikelArray.Add(DiArtikel)
    12. Next
    13. End Sub
    Ist deine schuld, dass die Sub son komischen Namen hat - du hast deim Code ja keinen gegeben.
    Wie du ausserdem siehst, sind alle VorausDeklarationen weg - es wird jetzt genau da deklariert, wo die Objekte gebraucht werden.
    Das ist kürzer, und ausserdem versteht man auch (besser), wozu sie gebraucht werden.

    Ausserdem die ArrayList durch List(Of T) ersetzt.
    ArrayList ist eine untypisierte Gurke und Altlast aus 2003, die man nie mehr verwenden sollte.

    Dann solltest du Visual Studio - Empfohlene Einstellungen machen, also Option Strict On, und Micorsoft.Visualbasic-Namespace raus.

    So, damit wirst du erstmal reichlich beschäftigt sein, und sicher werden Fragen kommen, denn je später man das bei sich einführt, desto mehr Sch... klebt bereits anne Schuhe.

    Edit:
    Man kann auch anne Benamung weiter machen, weil Nomen est Omen!
    Wenn du mir sagst, was wirklich inne Dictionaries steht - dann kann man glaub das meiste so umbenennen, dass man gradezu einen "Versteh-Flash" kriegt, wenn man nur draufguckt.
    Sind das da inne Dictionaries Artikel-Namen und Preise, Namen und Bestellnummern, Kategorien und Artikel, ... - sowas will ich wissen.

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

    VB.NET-Quellcode

    1. Private Sub BTEXCELLaden_Click(sender As Object, e As EventArgs) Handles BTEXCELLaden.Click
    2. Dim arAlleArtikel As New List(Of Dictionary(Of String, String))
    3. Dim intArtikelanzahl As Integer = exApp.Range("A22", exApp.Range("A22").End(XlDirection.xlDown)).Count
    4. Dim rngZeilen As Excel.Range = exApp.Range("A22", "A" & intArtikelanzahl + 2
    5. For Each Zeile As Excel.Range In rngZeilen
    6. Dim ArtikelZeile As Excel.Range = exApp.Range("A" & Zeile.Row, "QZ" &_
    7. Zeile.Row)
    8. Dim diArtikel As New Dictionary(Of String, String)
    9. For Each Atribut As Excel.Range In ArtikelZeile
    10. diArtikel.Add(CStr(exApp.Range(exApp.Cells(4, Atribut.Column),
    11. exApp.Cells(4, Atribut.Column)).Text), CStr(Atribut.Text))
    12. Next
    13. arAlleArtikel.Add(DiArtikel)
    14. Next
    15. End Sub




    Habe die Variablen umbenannt. Ich hoffe, es ist jetzt etwas verständlicher.
    Eingelesen wird eine Excel Liste wo in der 4. Zeile die Attributnamen.
    Ab Zeile 22 stehen die Attribute von Artikeln. Pro Zeile ein Artikel.
    Option Strict habe ich an.
    Wenn ich den Namespace 'Microsoft.VisualBasic' entferne, bekomme Ich viele Fehler. :cursing:
    Wie kann ich dann z.b. einen Zeilenumbruch machen? (vbcrlf)

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „vbBeginner“ ()

    vbBeginner schrieb:

    Wie kann ich dann z.b. einen Zeilenumbruch machen? (vbcrlf)
    In einer Excel-Zelle?
    Das wäre ein "weicher" Umbruch.
    Da ist kein &h0D &h0A (vbcrlf) drin, sondern nur ein &h0A (vbLf).
    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!

    vbBeginner schrieb:

    Habe die Variablen umbenannt. Ich hoffe, es ist jetzt etwas verständlicher.
    keine Ahnung - das Layout hast du unleserlich gemacht - kannst du vlt. die Einrückungen auch richtig machen?

    Und du hast meine Frage nicht beantwortet, und ich hab mir sone Mühe gegeben, mich klar auszudrücken:
    Sind das da inne Dictionaries Artikel-Namen und Preise, Namen und Bestellnummern, Kategorien und Artikel, ... - sowas will ich wissen.

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

    RodFromGermany schrieb:

    In einer Excel-Zelle?


    Nicht in einer Excel Zelle, sondern in einer MessageBox.



    ErfinderDesRades schrieb:

    das Layout hast du unleserlich gemacht


    Leider Zerschießt mir die Textbearbeitung in diesem Forum immer die Formatierung.
    Jedes mal wenn ich auf Bearbeiten klicke steht wieder alles Links.

    Zu deiner Frage:
    Im einem Dictionarie stehen die Attribute(Modell,Farbe, Material, Größe) als Key und (Rudi, Blau, Stoff, 20x60) als Wert.
    Und pro Artikel wird ein Dictionarie erstellt.

    vbBeginner schrieb:

    MessageBox
    Da geht alles:

    VB.NET-Quellcode

    1. MessageBox.Show("aaa" & vbCr & "bbb" & vbLf & "ccc" & vbCrLf & "ddd")
    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!
    also ich hab jetzt so überarbeitet - zunächstmal wies war:

    VB.NET-Quellcode

    1. Private Sub BTEXCELLaden_Click(sender As Object, e As EventArgs) Handles BTEXCELLaden.Click
    2. Dim arAlleArtikel As New List(Of Dictionary(Of String, String))
    3. Dim intArtikelanzahl As Integer = exApp.Range("A22", exApp.Range("A1").End(XlDirection.xlDown)).Count
    4. Dim rngZeilen As Excel.Range = exApp.Range("A22", "A" & intArtikelanzahl + 2
    5. For Each Zeile As Excel.Range In rngZeilen
    6. Dim ArtikelZeile As Excel.Range = exApp.Range("A" & Zeile.Row, "QZ" & Zeile.Row)
    7. Dim diArtikel As New Dictionary(Of String, String)
    8. For Each Atribut As Excel.Range In ArtikelZeile
    9. diArtikel.Add(CStr(exApp.Range(exApp.Cells(4, Atribut.Column), exApp.Cells(4, Atribut.Column)).Text), CStr(Atribut.Text))
    10. Next
    11. arAlleArtikel.Add(DiArtikel)
    12. Next
    13. End Sub

    • BTEXCELLaden - unleserlich - mach camelCase: btExcelLaden
    • arAlleArtikel As New List(Of Dictionary(Of String, String)) was bedeutet "ar"? doch nicht Array? weil es ist ja kein Array, es ist ja eine List(Of T)
    • Dim diArtikel As New Dictionary(Of String, String) - vlt ArtikelAttribute nennen (sorry - so viel besser find ich auch kein Namen)?
    • CStr(Atribut.Text) - typisch Datentyp-Anfänger: wandeln etwas nochmal extra nach String um, was bereits "Text" heisst. Ist Atribut.Text nicht bereits vom Datentyp String?



    meine Version:

    VB.NET-Quellcode

    1. Private Sub btExcelLaden_Click(sender As Object, e As EventArgs) Handles btExcelLaden.Click
    2. Dim AlleArtikelAttribute As New List(Of Dictionary(Of String, String))
    3. Dim zeilenAnzahl = exApp.Range("A22", exApp.Range("A1").End(XlDirection.xlDown)).Count
    4. Dim rngZeilen As Excel.Range = exApp.Range("A22", "A" & zeilenAnzahl + 2
    5. For Each Zeile As Excel.Range In rngZeilen
    6. Dim ArtikelZeile As Excel.Range = exApp.Range("A" & Zeile.Row, "QZ" & Zeile.Row)
    7. Dim ArtikelAttribute As New Dictionary(Of String, String)
    8. For Each Atribut As Excel.Range In ArtikelZeile
    9. ArtikelAttribute.Add(CStr(exApp.Range(exApp.Cells(4, Atribut.Column), exApp.Cells(4, Atribut.Column)).Text), CStr(Atribut.Text))
    10. 'ist das nicht das gleiche?
    11. Dim cell = exApp.Range(exApp.Cells(4, Atribut.Column))
    12. ArtikelAttribute.Add(exApp.Range(cell, cell).Text, Atribut.Text)
    13. 'und ginge nicht auch so?
    14. ArtikelAttribute.Add(exApp.Range(exApp.Cells(4, Atribut.Column)).Text, Atribut.Text)
    15. Next
    16. AlleArtikelAttribute.Add(ArtikelAttribute)
    17. Next
    18. End Sub
    beachte auch die Kommentare, wie ich schrittweise zeile#9 aufzuräumen versuche. Wenn gut geht, kann zeilen #9 - #14 dann ja weg.
    dann nimmst du einfach Environment.NewLine
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    ErfinderDesRades schrieb:

    CStr(Atribut.Text) - typisch Datentyp-Anfänger: wandeln etwas nochmal extra nach String um, was bereits "Text" heisst. Ist Atribut.Text nicht bereits vom Datentyp String


    Lt. OptionStrict ist es ein Object. (Hab mich auch gewundert)

    ErfinderDesRades schrieb:

    ArtikelAttribute.Add(CStr(exApp.Range(exApp.Cells(4, Atribut.Column), exApp.Cells(4, Atribut.Column)).Text), CStr(Atribut.Text))

    'ist das nicht das gleiche?


    Leider nicht. Wenn man Cells innerhalb von Range verwendet, muss man beide Argumente Angeben.

    ErfinderDesRades schrieb:

    arAlleArtikel As New List(Of Dictionary(Of String, String)) was bedeutet "ar"? doch nicht Array? weil es ist ja kein Array, es ist ja eine List(Of T)


    Ja sorry. Mein Fehler. LiAlleArtikel währe treffender.