ArrayList Item Inhalt abfragen

  • VB.NET

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

    ArrayList Item Inhalt abfragen

    Hallo.

    Aktuell bin ich dabei aus einer Tabelle den Namen und den Status von Mitarbeitern in eine Arraylist zu packen. Funktioniert auch. Nur muss ich später den Namen und den Status einzelnt abfragen können. Und genau das bekomme ich nicht gebacken.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Dim nameStatusList As New ArrayList
    2. For i As Integer = 0 To mitarbeiterDT.Rows.Count - 1
    3. Dim nameStatus(1) As String
    4. nameStatus(0) = mitarbeiterDT.Rows(i)(0).ToString
    5. nameStatus(1) = mitarbeiterDT.Rows(i)(1).ToString
    6. nameStatusList.Add(nameStatus)
    7. Next

    Dabei kommt eine ArrayList mit 13 Items raus, jedes Item hat dann 2 Werte: Name und Status. Wie kann ich die abfragen?

    Aktuell habe ich das so gelöst (sehr umständlich):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'nameStatusList aufspalten (nur Name)
    2. Dim nameList1 As New List(Of String)
    3. Dim nameList2 As New List(Of String)
    4. Dim nameListFinish As New List(Of String)
    5. Dim arbeiten As String = "Arbeiten"
    6. Dim krank As String = "Krank"
    7. Dim raucherpause As String = "Raucherpause"
    8. For i As Integer = 0 To nameStatusList.Count - 1
    9. If CBool(nameStatusList.Item(i).CompareTo(arbeiten)) = True Then
    10. nameList1.Add(nameStatusList.Item(i))
    11. End If
    12. Next
    13. For i As Integer = 0 To nameList1.Count - 1
    14. If CBool(nameList1.Item(i).CompareTo(krank)) = True Then
    15. nameList2.Add(nameList1.Item(i))
    16. End If
    17. Next
    18. For i As Integer = 0 To nameList2.Count - 1
    19. If CBool(nameList2.Item(i).CompareTo(raucherpause)) = True Then
    20. nameListFinish.Add(nameList2.Item(i))
    21. End If
    22. Next
    Mach aus

    Lukas97 schrieb:

    ArrayList
    eine List(Of String()).
    -----
    Was soll hier passieren:

    Lukas97 schrieb:

    VB.NET-Quellcode

    1. If CBool(nameStatusList.Item(i).CompareTo(arbeiten)) = True Then
    Was genau gibt .CompareTo zurück?
    Was also konvertierst Du in ein Boolean?
    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!
    Wenn der Wert "i" gleich zu "arbeiten" ist, also true, dann soll er das Item der neuen Liste hinzufügen.
    Und mit List(Of String) sind wir da, wie ich es schon sehr umständlich gelöst habe...

    RodFromGermany schrieb:

    Was genau gibt .CompareTo zurück?

    Lukas97 schrieb:

    also true
    wohl nicht.
    Schmeiß das CBool() raus und ergründe, was da passiert.
    Wie kann man Strings vergleichen?
    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!
    Das ist die Lösung, die schon einwandfrei funktioniert. Nur sehr umständlich. Das ganze müsste ich jetzt noch für den Status machen und später Name+Status wieder zusammenführen können.
    Ich möchte das aber über eine ArrayList oder List(Of Array) regeln. Da ich dort alles schon geregelt habe.
    Vergiss ArrayList, das ist untypisiertes Zeugs.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Kannst du damit was anfangen? Für dein Problem eignet sich ein Dictionary ganz gut.

    VB.NET-Quellcode

    1. Module Module1
    2. Enum eMaStatus
    3. Arbeiten
    4. Krank
    5. Pause
    6. Reise
    7. End Enum
    8. Dim dic As New Dictionary(Of String, eMaStatus)
    9. Sub Main()
    10. dic.Add(key:="Arnie", value:=eMaStatus.Arbeiten)
    11. dic.Add(key:="Bert", value:=eMaStatus.Krank)
    12. dic.Add(key:="Conny", value:=eMaStatus.Pause)
    13. dic.Add(key:="Det", value:=eMaStatus.Arbeiten)
    14. Dim Status As eMaStatus = dic.Item("Conny") ' Status = Pause
    15. ' Liste von Dictionary-Einträgen aller arbeitenden MA.
    16. Dim ArbeitendeMitarbeiter = dic.Where(Function(p) p.Value = eMaStatus.Arbeiten)
    17. End Sub
    18. End Module
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!
    Ja, damit kann ich was anfangen. Funktioniert auch soweit ganz gut.
    Habe aber noch ein wenig probiert und schließlich die Lösung gefunden :)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Dim nameStatusGruppeList As New ArrayList
    2. For i As Integer = 0 To mitarbeiterDT.Rows.Count - 1
    3. Dim status(2) As String
    4. status(0) = mitarbeiterDT.Rows(i)(0).ToString
    5. status(1) = mitarbeiterDT.Rows(i)(1).ToString
    6. status(2) = mitarbeiterDT.Rows(i)(2).ToString
    7. nameStatusGruppeList.Add(status)
    8. Next
    9. 'Namen in eine Liste packen
    10. Dim nameList As New List(Of String)
    11. For i As Integer = 0 To nameStatusGruppeList.Count - 1
    12. Dim name() As String = CType(nameStatusGruppeList(i), String())
    13. nameList.Add(name(0))
    14. Next
    15. 'Status in eine Liste packen
    16. Dim statusList As New List(Of String)
    17. For i As Integer = 0 To nameStatusGruppeList.Count - 1
    18. Dim status() As String = CType(nameStatusGruppeList(i), String())
    19. statusList.Add(status(1))
    20. Next
    Wieso hast Du das ignoriert?

    Trade schrieb:

    Vergiss ArrayList, das ist untypisiertes Zeugs.


    Jetzt nutzt Du ja wieder die, obwohl die List(Of T) die richtige Option wäre und Du die ja sogar unten nutzt.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Nur weil's funktioniert, ist es nicht gut. ;)
    Und 'ne große Änderung ist das nicht und schon hast Du eine typisierte Collection.
    Die ist das eben nicht, was schlecht ist.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Trade schrieb:

    typisierte

    Er weiß offensichtlich nicht, was das heißt.

    Typisierte Auflistungen haben den Vorteil, dass vorhersagbar ist, welchen Datentyp (String, Integer, ...) ein Element hat. In einer ​List(Of String) sind bspw. nur Strings drin. In einer Arraylist kann aber alles (also z. B. auch Booleans oder sogar Klasseninstanzen) drin sein. Daher kann dir dein Programm abstürzen, weil du vom VisualStudio nicht auf Fehler aufmerksam gemacht wirst. Untypisierten Code kann es nämlich nicht untersuchen.

    Ich nehme an, du liest das Openbook von Theiss, richtig? Lass das, das lehrt dich nämlich genau solche Fehler. @ErfinderDesRades hat das hier mal zusammengefasst: erfinderdesrades.unitweb.de/Programmer/Blogs/BuchLesen.html
    Mit freundlichen Grüßen,
    Thunderbolt
    Ist mir schon klar was das heißt. Nur im diesem Fall ist dies nicht nötig, da das Programm darauf abgestimmt ist, nur den String zu nehmen. Und in der Tabelle stehen auch nur Strings.
    Das ändert nichts daran, dass sie untypisiert ist, auch wenn Du nur Strings reinstopfst.
    Du kannst das ohne Aufwand bzw. viele Änderungen (war glaub ich sogar nur der Typ) eine generische Liste daraus machen und fertig. Dann ist's sauber.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich muss mich wohl selbst zitieren. Besonders möchte ich, dass du meine Frage im letzten Absatz beantwortest.

    Thunderbolt schrieb:

    Daher kann dir dein Programm abstürzen, weil du vom VisualStudio nicht auf Fehler aufmerksam gemacht wirst. Untypisierten Code kann es nämlich nicht untersuchen.

    Ich nehme an, du liest das Openbook von Theiss, richtig? Lass das, das lehrt dich nämlich genau solche Fehler. @ErfinderDesRades hat das hier mal zusammengefasst: erfinderdesrades.unitweb.de/Programmer/Blogs/BuchLesen.html
    Mit freundlichen Grüßen,
    Thunderbolt

    Thunderbolt schrieb:

    Ich muss mich wohl selbst zitieren. Besonders möchte ich, dass du meine Frage im letzten Absatz beantwortest.


    Ich habe das Buch mal angefangen zu lesen. Mittlerweile versuche ich mir alles selbst beizubringen :D
    Und bis jetzt ist das Programm nicht abgestürzt o.Ä.

    Lukas97 schrieb:

    Mittlerweile versuche ich mir alles selbst beizubringen
    Nette Idee, aber du solltest dich dennoch nicht vehement gegen Empfehlungen erfahrener Leute wehren. Diese wissen - in den meisten Fällen - ganz genau was sie sagen.

    Lukas97 schrieb:

    Und bis jetzt ist das Programm nicht abgestürzt o.Ä.
    Das ist doch egal ob es "funktioniert", wenn du nicht gleich richtig anfängst, dann hast du am Ende riesen Probleme diese falschen Gewohnheiten wieder abzulegen.

    Also bau deine Array List zu einem List(Of string) um.
    Ich Antworte nach bestem Wissen und Gewissen. Ich übernehme keine Garantie für die Richtigkeit oder Fehlerfreiheit meiner Texte.


    Ich konnte dir helfen?
    - Das ist schön :) Ich würde mich über ein "Hilfreich" freuen ^^