none
VB2017: Index in einer List(of String) anhand eines Arrays suchen RRS feed

  • Frage

  • Hallo Forum, ich seh gerade den Wald vor lauter Bäumen nicht....

    Ich habe eine List(of String) mit folgenden Inhalten:

    Nun muss ich diese Liste nach dem Vorkommen eines Strings aus einem DataGridView durchsuchen und mir den Index der Liste zurückgeben lassen. Daran scheitere ich schon... Ich habe diverse Möglichkeiten durchprobiert, aber obwohl die Strings immer identisch sind, erkennt er das nicht.

    Mein letzter Versuch war:

    For i As Integer = 0 To dgvEndstand.Rowcount-1
       if vPlatzierung.Contains(dgvEndstand.Rows(i).Cells(1).Value.tostring) then
          MsgBox ("Ist da!")
       End if
    Next

    Ich hab auch schon die Beispiele mit Findindex für Listen durch, aber das hat alles nicht funktioniert. Übersehe ich da irgendwas grundsätzliches? Bin dankbar für jeden Tipp....

    LG Micha

    Mittwoch, 6. Juni 2018 09:15

Antworten

  • Hallo Micha,

    ja dann geht das so nicht.

    Dazu musst Du dann den String jedes Listenelements noch einmal zerlegen z.B. mit der Split-Methode.

    Dies erfordert aber eine weiter verschachtelte Schleife, das sieht dann z.B. so aus:

    Dim arr As Array
    Dim Element As String
    Dim Subelement As String
    Dim Zelle As String
    For i As Integer = 0 To dgvEndstand.RowCount - 2
        Zelle = dgvEndstand.Rows(i).Cells(0).Value.ToString
        For Each element In vPlatzierung
            arr = element.Split(";")
            For Each Subelement In arr
                If Subelement = Zelle Then
                    MsgBox("Ist da!")
                End If
            Next
        Next
    Next

    Falls Du schon weist an welcher Stelle (also nach welchem Semikolon) der Teilstring steht, kann man sich eine Schleife sparen. Das müsstest Du uns aber dann hier noch mitteilen.

    Grüße

    Roland


    • Bearbeitet Roland Franz Donnerstag, 7. Juni 2018 06:06
    • Als Antwort markiert MKnost Donnerstag, 7. Juni 2018 10:28
    • Tag als Antwort aufgehoben MKnost Donnerstag, 7. Juni 2018 10:29
    • Als Antwort markiert MKnost Donnerstag, 7. Juni 2018 10:29
    Donnerstag, 7. Juni 2018 06:03

Alle Antworten

  • Hallo Micha,

    prinzipiell ist Dein Code ok. Du könntest die Indizes noch einmal prüfen.

    Hast Du die richtige Spaltennummer?

    Im Zweifelsfall kannst Du auch einmal zwischenvariablen verwenden, die Du Dir vor dem Vergleich im Debugger anschauen kannst.

    Grüße

    Roland

    PS: Der Vergleich ist case sensitive, d.h. Groß/Kleinschreibung muss passen!


    PPS: dgvEndstand.Rowcount -2 müsste reichen.
    Mittwoch, 6. Juni 2018 09:36
  • Hi Micha,

    "vPlazierung" ist doch deine Liste. Müsste/Könnte das dann nicht in etwa so aussehen (hab mal kurz in einer Konsolen-Anwendung gespielt):

    List<string> myList = new List<string>() { "eins", "zwei", "drei", "vier", "fünf", "sechs" };
    string myString = "drei";
    
    //Eintrag vorhanden
    bool b = myList.Any(s => myString.Contains(s));
    //Index finden
    int i = myList.FindIndex(r => r.Contains(myString));
    
    Console.WriteLine(b.ToString());
    Console.WriteLine(i.ToString());

    Gruß Stefan


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 6. Juni 2018 12:30
  • Hallo Stefan,

    er will ja schauen ob ein Eintrag aus dem GridView in der Liste enthalten ist.

    In Deinem Beispiel wird nur ein fester String in der Liste gesucht. Daher ist das ganze bei Ihm in der Schleife, was ja auch funktioniert, wahrscheinlich bis auf die beiden Einschränkungen die ich in meinem ersten Post genannt habe.

    Grüße

    Roland

    Mittwoch, 6. Juni 2018 12:42
  • Hallo Roland, du hast absolut recht. Contains funktioniert natürlich aus so auf einer List.

    Mein fester String war lediglich Ersatz für den dgv Eintrag. Wobei man natürlich anmerken kann, das man eigentlich nicht auf's dgv zugreift, sondern auf die Quelle.

    Gruß


    Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP

    Mittwoch, 6. Juni 2018 13:07
  • . Wobei man natürlich anmerken kann, das man eigentlich nicht auf's dgv zugreift, sondern auf die Quelle.

    Da hast Du absolut Recht, da der TE aber die Quelle nicht angeben hat, ist es auch schwierig den für Ihn passenden Code mit zugriff auf die Quelle zu zeigen.

    Grüße

    Roland

    Mittwoch, 6. Juni 2018 13:23
  • Hallo, erstmal danke für die vielen Anregungen.

    Leider bin ich noch nicht so bewandert mit VB und der Datenverarbeitung. 

    Kann mein Problem daher rühren, dass ich in der Liste einen String mit mehreren Infos durch Semikolon getrennt abgelegt habe? Wenn ich die Liste mit for each durchgehe und den Like-Operator zum suchen nehme, funktioniert das problemlos.

    lg Micha 

    Mittwoch, 6. Juni 2018 16:42
  • Hallo Micha,

    ja dann geht das so nicht.

    Dazu musst Du dann den String jedes Listenelements noch einmal zerlegen z.B. mit der Split-Methode.

    Dies erfordert aber eine weiter verschachtelte Schleife, das sieht dann z.B. so aus:

    Dim arr As Array
    Dim Element As String
    Dim Subelement As String
    Dim Zelle As String
    For i As Integer = 0 To dgvEndstand.RowCount - 2
        Zelle = dgvEndstand.Rows(i).Cells(0).Value.ToString
        For Each element In vPlatzierung
            arr = element.Split(";")
            For Each Subelement In arr
                If Subelement = Zelle Then
                    MsgBox("Ist da!")
                End If
            Next
        Next
    Next

    Falls Du schon weist an welcher Stelle (also nach welchem Semikolon) der Teilstring steht, kann man sich eine Schleife sparen. Das müsstest Du uns aber dann hier noch mitteilen.

    Grüße

    Roland


    • Bearbeitet Roland Franz Donnerstag, 7. Juni 2018 06:06
    • Als Antwort markiert MKnost Donnerstag, 7. Juni 2018 10:28
    • Tag als Antwort aufgehoben MKnost Donnerstag, 7. Juni 2018 10:29
    • Als Antwort markiert MKnost Donnerstag, 7. Juni 2018 10:29
    Donnerstag, 7. Juni 2018 06:03