String Array mit Foreach Schleife füllen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 72 Antworten in diesem Thema. Der letzte Beitrag () ist von Orion.

    ist mir im Grunde auch egal. jdfs. ist Array die Basis der allermeisten Auflistungen, insbesondere (größen-)flexibler Auflistungen, und die Flexiblität wird dadurch erreicht, dass intern redimensioniert wird.
    also gut - ohne Redim.

    @AliveDevil : Ja, IEnumerable(Of T) wäre noch flexibler, aber vlt. brauchen die Methoden ja intern eine indizierbare Auflistung.
    Vermutlich verlangen sie deshalb ein Array, weil Array nunmal das performanteste ist - sonst müssten sie erst intern eines erstellen.

    Ein anderer Grund wird sein, dass es Arrays schon immer gibt, IEnumerable(Of T) aber erst seit 2005.
    Darf ich noch nebenbei fragen wie ich ein Object Array in ein String Array umwandle?
    EDIT: habs glaube ich schon rausgefunden wenn ichs jetzt noch testen könnte.
    Bekomme aber eine MissingMemberException obwohl ich den Import gemacht habe? oder Muss da noch mehr?

    VB.NET-Quellcode

    1. Imports System.IO.Fileinfo

    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

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

    Funktioniert auch nicht, naja ich glaube meine IDE spinnt auch allgemein ein bisschen rum ich Update mal 2012 und versuchs darin nochmal.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Diesen Code musst Du in eine Prozedur schreiben, nicht aber in die Klasse.
    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!
    Ups, dummer Fehler. Aber müsste es so nicht funktionieren?

    VB.NET-Quellcode

    1. Public woerterbuchS() As String
    2. Dim Files = New System.IO.DirectoryInfo(Environment.SpecialFolder.ApplicationData & "\***").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    3. Dim woerterbuch = Files.Select(Function(f) f.Name).ToArray()
    4. For Each fileName In woerterbuch
    5. ReDim Preserve woerterbuchS(UBound(woerterbuchS) + 1)
    6. woerterbuchS(UBound(woerterbuchS)) = fileName.ToString
    7. Next fileName

    Nachdem Versuch von Object in String zu konvertieren habe ich immer noch keine Werte in woerterbuchS(Habe ich auch ausserhalb der Sub deklariert)
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    ausgehend vom Code in deinem ersten Post könnte es auch so aussehen (nicht getestet)

    VB.NET-Quellcode

    1. Private woerterbuch() As String
    2. Dim Dateiliste() As String = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\*CENSORED*", "*.*", System.IO.SearchOption.TopDirectoryOnly)
    3. Private Sub myForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    4. ReDim woerterbuch(Dateiliste.Length - 1)
    5. For i = 0 To Dateiliste.Length - 1
    6. woerterbuch(i) = IO.Path.GetFileName(Dateiliste(i))
    7. Next
    8. End Sub

    Orion schrieb:

    funktionieren
    Sieh Dir mal das an. Stell sicher, dass auch Dateien da sind:

    VB.NET-Quellcode

    1. Public woerterbuchS As New List(Of String)
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Dim Files() = New System.IO.DirectoryInfo(Environment.SpecialFolder.ApplicationData & "\***").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    4. woerterbuchS.AddRange(Files.Select(Function(f) f.Name).ToArray())
    5. End Sub

    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!
    Hab ich alles zuvor schon ausprobiert dann bekomm ich aber bei dieser Zeile den Fehler das der Datentyp explizit angegeben werden muss:

    VB.NET-Quellcode

    1. Dim t() As String = Array.FindAll(woerterbuchS, AddressOf find_key)
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Es ist ja eine Intellisense Form die auftritt wenn der User bei einer Textbox eine Eingabe macht und die ersten Buchstaben übereinstimmen mit den Dateinamen die bereits gespeichert wurden. Dann kann er diese selektieren und die Textfelder werden alle mit dem Inhalt dieser Dateien gefüllt.
    Habe jetzt folgender Code der mir keinen Fehler gibt aber auch immer noch keine Werte. Ich glaub ich hab jetzt so lang rumprobiert MSDN usw. gelesen das ich gar nicht mehr produktiv denken kann x.x
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub RefreshList(ByVal key As String)
    2. Dim fileName As String
    3. Dim Files = New System.IO.DirectoryInfo(Environment.SpecialFolder.ApplicationData & "\***").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    4. Dim woerterbuch = Files.Select(Function(f) f.Name).ToArray()
    5. woerterbuchS.AddRange(Files.Select(Function(f) f.Name).ToArray())
    6. Me.ListBox1.Items.Clear()
    7. find_key_arg = key & "*"
    8. Dim LA() As String = woerterbuchS.ToArray
    9. Dim t() As String = Array.FindAll(LA, AddressOf find_key)
    10. For Each fileName In woerterbuchS
    11. ReDim Preserve t(UBound(t) + 1)
    12. t(UBound(t)) = fileName.ToString
    13. Next fileName
    14. If t.Count > 0 Then
    15. If key = "" Or t(t.Length - 1) = key Then
    16. _iskeyword = False
    17. Me.Hide()
    18. Else
    19. _iskeyword = True
    20. Me.ListBox1.Items.AddRange(t)
    21. Me.ListBox1.SelectedIndex = 0
    22. Me.Show()
    23. End If
    24. Else
    25. _iskeyword = False
    26. Me.Hide()
    27. End If
    28. End Sub
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Hm ich hab hier mal was gebastelt:

    VB.NET-Quellcode

    1. Private _woerterbuch As New List(Of System.IO.FileInfo)
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. _woerterbuch = New System.IO.DirectoryInfo("DEINPFAD").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly).ToList()
    4. ListBox1.DataSource = _woerterbuch
    5. ListBox1.DisplayMember = "Name"
    6. ListBox1.ValueMember = "FullName"
    7. End Sub
    8. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    9. ListBox1.DataSource = Nothing
    10. ListBox1.DataSource = _woerterbuch.FindAll(Function(n) n.Name.ToLower.Contains(TextBox1.Text.ToLower))
    11. End Sub
    12. Private Sub ListBox1_DoubleClick(sender As Object, e As EventArgs) Handles ListBox1.DoubleClick
    13. Dim item = DirectCast(ListBox1.SelectedItem, System.IO.FileInfo)
    14. MessageBox.Show(String.Format("Pfad: {0}, Größe: {1} Bytes", item.FullName, item.Length))
    15. End Sub


    Auf der Form hatte ich eine Listbox (Listbox1) und eine Textbox (Textbox1).
    Es wird das gesamte Wörtbuch an die Listbox gebunden. Bei jedem Textchanged werden nur mehr die Dateien angezeigt welche dem Suchmuster der Textbox entsprechen. Per Doppelklick castet man einfach das Item (welches ja ein FIleInfo-Objekt ist) wieder zurück in FileInfo und kann auf alle EIgenschaften zugreifen.

    Vielleicht ist das ein Ansatz für dich.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hmm... damit kann ich ja die Listbox füllen das hätte ich schon gehabt. Ich muss ja daraus diese Intellisense Funktion bauen weils die für RichTextBoxen nicht vordefiniert gibt. Hatte das Snippet irgendwo gefunden mit der einfachsten Art einfach ein Array mit festen Daten mitzugeben. Das ganze soll eben dann so funktionieren das die Form im Hintergrund wartet und am Rand erscheint wenn Übereinstimmungen vorhanden sind, dann werden diese übereinstimmenden Dateien gelistet. Wenn man die Eingabe wieder löscht versteckt sich die Form wieder, das ganze ist also dynamisch und ich brings da nicht fertig die Dateien mit dieser Listbox so zu verknüpfen das es eben funktioniert.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Naja im Textchanged (geht ja auch von der Richtextbox) kannst du ja abfragen ob etwas drin steht (.Lenght > 0).
    Die Zeile

    VB.NET-Quellcode

    1. ListBox1.DataSource = _woerterbuch.FindAll(Function(n) n.Name.ToLower.Contains(TextBox1.Text.ToLower))


    kann man ja aufteilen auf

    VB.NET-Quellcode

    1. Dim tmpList = _woerterbuch.FindAll(Function(n) n.Name.ToLower.Contains(TextBox1.Text.ToLower)).ToList()
    2. ListBox1.DataSource = tmpList
    3. If tmpList.Count > 0 then
    4. me.Show()
    5. Else
    6. me.hide()
    7. ENd If


    So in der Art halt.

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

    Orion schrieb:

    explizit angegeben werden muss
    Bei mit läuft der Code wie er da steht (ein anderer Pfad natürlich).
    -----
    @fichz Me.Visible = (tmpList.Count > 0)
    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:

    Bei mit läuft der Code wie er da steht (ein anderer Pfad natürlich).

    Okay... So wie es aussieht bin ich blöd... Hab Testweise den Pfad zu nem nicht existierenden Ordner geführt und dann gesehen das er die Ordner im Debugmode auch im Debug Ordner erstellt. Logisch hab ich keine Daten x.x Naja ... Dann muss ich für heute nur noch rausfinden wieso mir die Files Doppelt oder sogar 3-fach angezeigt werden dann kann ich Feierabend machen. Das hat mich nu zu viel Nerven gekostet ^^
    Danke für eure Beihilfe dabei.

    EDIT: Hab mich zu früh gefreut, hab das Tool jetzt mal kompiliert und erhalte bei der Eingabe in die Textbox egal welcher Art eine Exception wegen der Intellisense das keine Integer angenommen werden obwohl ich Text schreibe. Kann mir jemand sagen warum? O.o
    Hier der Code der Textbox:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. With Me.RichTextBox1
    2. Dim last() As String = Regex.Split(.Text.Substring(0, .SelectionStart).TrimEnd, "[\s]")
    3. Select Case e.KeyCode
    4. Case Keys.Space
    5. If auto.IsKeyWord = True Then
    6. .SelectionStart = .SelectionStart - last(last.Count - 1).Length
    7. .SelectionLength = last(last.Count - 1).Length
    8. .SelectedText = auto.IsBestKeyWord
    9. auto.RefreshList("")
    10. End If
    11. Case Keys.Left, Keys.Right, Keys.Up, Keys.Down
    12. Case Else
    13. auto.RefreshList(last(last.Length - 1))
    14. If auto.IsKeyWord = True Then
    15. Dim p As Point = .PointToScreen(.GetPositionFromCharIndex(.SelectionStart))
    16. auto.Location = New Point(p.X, p.Y + 20)
    17. Else
    18. auto.Hide()
    19. End If
    20. End Select
    21. End With

    Und hier der Code den ich jetzt für die IntelliSense Form habe:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FormAutoComplete
    2. Public _isbestkeyword As String = ""
    3. Public _iskeyword As Boolean
    4. Public woerterbuchS As New List(Of String)
    5. Public Sub myForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    6. Me.FormBorderStyle = Windows.Forms.FormBorderStyle.None
    7. Me.Size = New Size(200, 20)
    8. Me.ListBox1.Dock = DockStyle.Fill
    9. End Sub
    10. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    11. _isbestkeyword = Me.ListBox1.Items(Me.ListBox1.SelectedIndex)
    12. End Sub
    13. Protected Overrides ReadOnly Property ShowWithoutActivation() As Boolean
    14. Get
    15. Return True
    16. End Get
    17. End Property
    18. Public Sub RefreshList(ByVal key As String)
    19. 'Dim fileName As String
    20. Dim Files = New System.IO.DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData & "\***")).GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    21. woerterbuchS.AddRange(Files.Select(Function(f) f.Name).ToArray())
    22. Dim LA() As String = woerterbuchS.ToArray
    23. Me.ListBox1.Items.Clear()
    24. find_key_arg = key & "*"
    25. Dim t() As String = Array.FindAll(LA, AddressOf find_key)
    26. If t.Count > 0 Then
    27. If key = "" Or t(t.Length - 1) = key Then
    28. _iskeyword = False
    29. Me.Hide()
    30. Else
    31. _iskeyword = True
    32. Me.ListBox1.Items.AddRange(t)
    33. Me.ListBox1.SelectedIndex = 0
    34. Me.Show()
    35. End If
    36. Else
    37. _iskeyword = False
    38. Me.Hide()
    39. End If
    40. End Sub
    41. Public ReadOnly Property IsKeyWord() As Boolean
    42. Get
    43. Return _iskeyword
    44. End Get
    45. End Property
    46. Public ReadOnly Property IsBestKeyWord() As String
    47. Get
    48. If _iskeyword = True Then
    49. Return _isbestkeyword
    50. Else
    51. Return ""
    52. End If
    53. End Get
    54. End Property
    55. Private find_key_arg As String
    56. Private Function find_key(ByVal s As String) As Boolean
    57. If s Like find_key_arg Then
    58. Return True
    59. Else
    60. Return False
    61. End If
    62. End Function
    63. End Class

    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Orion“ ()

    Setz mal

    Orion schrieb:

    Testweise
    einen Haltepunkt rein und verfolge den Inhalt der Arrays / Lists.
    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!
    Gibts dazu irgendwo eine Kurzübersicht oder so? :/ Habe mich bisher bei IDE's erst mit der Autovervollständigung auseinandergesetzt mehr noch nicht.
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)