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.

    String Array mit Foreach Schleife füllen

    ich glaube ich habe wieder ein Brett vorm Kopf in einer kleinen Sache.
    Ich möchte ein String Array mit Strings füllen die aus den Dateinamen aus einem Ordner bestehen.
    Am besten wär noch wenn ich davor diesen Strings den Pfad entfernen kann.
    Kann mir jemand sagen was ich hier erstmal falsch mache mit dem füllen des Arrays?

    VB.NET-Quellcode

    1. Dim fileName As String
    2. Private woerterbuch() As String
    3. Dim Dateiliste() As String = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\*CENSORED*", "*.*", System.IO.SearchOption.TopDirectoryOnly)
    4. Private Sub myForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    5. For Each Me.fileName In Dateiliste
    6. woerterbuch(fileName)
    7. Next fileName
    8. End Sub
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

    Per LINQ zB:

    VB.NET-Quellcode

    1. Dim Files = New System.IO.DirectoryInfo("PFAD").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    2. Dim Wörterbuch = Files.Select(Function(f) f.Name).ToArray()


    lg

    EDIT: Obwohl eine List(of String) besser zu handeln ist als ein Array ( Einfach anstatt .ToArray() -> .ToList())

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hallo,
    da ist einiges im Argem.
    1. du nutzt ein Array... gibt aber keine Dimension vor
    also irgendwie in Zeile 6 einfugen redim worterbuch(anzahl-files)

    2. Du setzt in Zeile 8 anstatt des Indexex den Namen: richtig wäre Wörterbuch(x)= Filename
    wobei x sich immer weiter erhöht.

    3. nur dateinmae ohne Path: = IO.Path.GetFileName
    @Orion Kannst Du vllt. Deinen Plan noch etwas detaillieren, da lässt sich ggf. einfacher helfen.
    Soll vermeiden, dass wir bei ganz kleinen Schritten kein Ziel vor den Augen haben.
    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!
    Problem ist ja das die Fileanzahl variiert, der Pfad ist ja im Appdata + Der Kommentar zum Ordner ist das falsch so?
    EDIT: Okey ich schicke mal den ganzen Code der Form, sollte eine Intellisense für RichTextboxen werden.
    Spoiler anzeigen

    VB.NET-Quellcode

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

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

    Visual Basic-Quellcode

    1. dim DeinArray(0) as string
    2. For Each FileName In Dateiliste
    3. redim preserve DeinArray(UBound(DeinArray)+1)
    4. DeinArray(Ubound(DeinArray)) = Filename
    5. Next fileName


    So wird halt das Array immer um 1 vergrößert und dann wird der Wert eingetragen
    Genau, wollte wissen wie genau es funktioniert nicht nur den Code. Aber danke für den Vorschlag. Habe jetzt aber einen anderen Fehler und ich glaube den hat meine IDE verursacht schliessen und öffnen des Projekts funktioniert auch nicht :/ Es sind Designerfehler und da habe ich gar keine Ahnung weil ich den automatisch generiert lasse wie er ist.
    Warnung:
    Spoiler anzeigen
    Warnung 1 Der Designer kann Code in Zeile 335 nicht ausführen:

    Me.RichTextBox8.Text = Global.****tool.My.Resources.Resources.WVorlage

    Der Code in der InitializeComponent-Methode wird von dem Designer erzeugt und darf nicht manuell geändert werden. Entfernen Sie alle vorgenommenen Änderungen, und öffnen Sie den Designer erneut. C:\****\Main.Designer.vb 336 0


    Fehler:
    Spoiler anzeigen

    Fehler 2 "WordVorlage" ist kein Member von "*****tool.My.Resources.Resources". C:\****\Main.Designer.vb 336 32 Hellertool


    In den Ressources ist auch die Vorlage drin mit dem Titel "Vorlage" habe auch versucht es so umzuschreiben dann bekomm ich da auf einmal den Fehler das man nicht in 1-dimensionale Arrays konventieren könne.
    Aber ich hab ja überhaupt nichts mit Ressourcen gemacht aktuell, warum bockt der mir auf einmal so?
    EDIT: Okey, merkwürdig hab mich mal ran gewagt und die ganzen Fehler gelöscht weil das was der da gemacht hat irgendwie keinen Sinn ergab. Nu ist alles wieder normal, also ich probier mal an den Arrays
    Metal-Schweiz wurde nun offiziell veröffentlich nach all den Jahren :)

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

    Ich möchte ein String Array mit Strings füllen die aus den Dateinamen aus einem Ordner bestehen.

    Das ist die Anforderung -> 2 Zeilen Code

    Am besten wär noch wenn ich davor diesen Strings den Pfad entfernen kann.

    Wird mit den 2 Zeilen Code performant erledigt.

    Kann mir jemand sagen was ich hier erstmal falsch mache mit dem füllen des Arrays?

    - Man verwende System.IO.FileInfo-Objekte welche man von der Methode DirectoryInfo.GetFiles() retour bekommt. Hier hat man Zugriff auf den Dateinamen ohne Ordner.
    - Man verwendet in dem Fall kein Array und man verwendet schon gar nicht(!!!!!) redim oder sonst was um die Größe zu verändern. Verwende eine List(of T). Diese lässt sich nach dem Befüllen wenn es unbedingt sein muss mit .toArray in ein Array zurückballern

    Hoffe das ist Erklärung genug.

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

    fichz schrieb:

    - Man verwendet in dem Fall kein Array und man verwendet schon gar nicht(!!!!!) redim oder sonst was um die Größe zu verändern.

    Das ist mir aber neu, das Array fehlerhaft in NET implementiert ist und man deshalb es nicht benutzen sollte.
    Auch Redim hat seine Berechtigung und ist auch ordnungsgemäß vorhanden und funktioniert bestens!
    Es mag andere von mir aus auch bessere Lösungen geben, aber jedes hat seine Vor- und Nachteile.
    Aber pauschal zu sagen "MAN" verwendet keine Arrays... ts ts ts

    Selbst NET benutzt diese intern an verschiedenen stellen, und das nicht ohne Grund. Auch ich benutze sie an bestimmten Stellen, und bisher ist mir deswegen noch kein Programm abgestürzt oder hat fehlerhafte Ergebnisse geliefert.

    Auch denke ich, das man List OF besser versteht und auch die Vorteile davon, wenn man sich mal mit Arrays beschäftigt hat und diese auch versteht. Dann wird einem auch klar warum für bestimmte Probleme List's besser geeignet sind.
    Grundlagen haben da noch nie geschadet.

    RoulettePilot schrieb:

    Selbst NET benutzt diese intern an verschiedenen stellen


    Kannst Du mal ein Beispiel sagen. Würde mich einfach interessieren.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    ReDim wird "intern" auf

    VB.NET-Quellcode

    1. dasArray = DirectCast(Utils.CopyArray(DirectCast(dasArray, Array), New Object(11) {}), Object())

    übersetzt. Und jetzt erzähl mir nicht, dass das .NET Framework das machen würde, denn so eine Konstruktion gibt es da garantiert nicht.
    Zudem ist Utils ein Teil des Microsoft.VisualBasic-Namespace, der unter allen Umständen vermieden werden muss.

    Also der Way-To-Go: List(Of T) bzw. Linq alles andere ist hingepfuscht und ohne Sinn genutzt.
    @AliveDevil Jou.
    @RoulettePilot
    @Don_Batisto ReDim würde ich in jedem Falle vermeiden, eine List(Of T) ist da stets die bessere Alternative.
    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!

    RoulettePilot schrieb:


    Auch denke ich, das man List OF besser versteht und auch die Vorteile davon, wenn man sich mal mit Arrays beschäftigt hat und diese auch versteht. Dann wird einem auch klar warum für bestimmte Probleme List's besser geeignet sind.
    Grundlagen haben da noch nie geschadet.

    keiner sagt (zumindest ich nicht) das Arrays BESSER sind.. aber pauschal zu sagen .. MAN nutzt diese nicht.. dagegen wehre ich mich.
    und in net werden oft genug Arrays zurückgeliefert (ich redete in diesem fall nicht von redim -- dazu reicht mein Wissen nicht aus, wie des intern geregelt ist)

    jedes Ding zu seiner Zeit :)
    jo - es gibt kein Grund, Array zu verteufeln. Array ist die schnellste indizierbare Auflistung, dies gibt, und auch List(Of T) verwendet intern ein Array, und redimensioniert es (ja - mit ReDim!), wenns voll ist.
    Array ist auch der Datentyp der in vielen Methoden als Argument erwartet wird (leider, denn IList(Of T) wäre in solchen Fällen flexibler).
    zB die String.Split(delimiter() As String)-Überladung.

    Und Array kann man immer problemlos verwenden, wenn von vornherein klar ist, wieviele Elemente kommen werden. Dann dimensioniert mans in der Größe, und befüllt es anschließend per For i - Schleife. Das ist sogar (minimal) performanter als eine List(Of T).
    Allerdings ists mit List(Of T) halt meist eleganter zu coden, was dann doch wieder einen kleinen Ausschlag für List(Of T) gibt.

    also hat seine Stärken (minimaler Overhead, beste Performance) und Schwächen (Größenwachstum nur durch unperformante Redimensionierung möglich)
    @RoulettePilot
    Du drehst mir das Wort im Mund um. Ich hab in keinem Satz erwähnt, dass Arrays "fehlerhaft" sind. Wenn du genau hinsiehst schrieb ich:

    fichz schrieb:

    Man verwendet in dem Fall kein Array


    Wer lesen kann ist klar im Vorteil.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Wieso IList(Of T)? Ein IEnumerable(Of T) ist doch deutlich flexibler, da ein Array ebenfalls von IEnumerable erbt.
    Im .NET Framework wird zwar mit Array-Resizes gearbeitet, dort aber deutlich besser, als über ein ReDim.
    List(Of T).Add() -> List(Of T).EnsureCapacity() -> List(Of T).Capacity.set

    Bei Orions Problem würde ich allerdings ein HashSet(Of T) nehmen, da es mit der Methode HashSet(Of T).Contains(T) schneller als List(Of T).Contains(T) ist und ebenfalls die dynamische Vergrößerung der Liste bietet.

    ErfinderDesRades schrieb:

    dies gibt, und auch List(Of T) verwendet intern ein Array, und redimensioniert es (ja - mit ReDim!)


    Es wird Array.Copy verwendet. Von diesem Redim-Konstrukt ist weit und breit nichts zu sehen. Redim wird letztendlich auch durch Array.Copy realisiert, da geb ich Dir recht. Redim wird zu dem Unding, was @AliveDevil gepostet hat. Also ist die Aussage mal generell falsch, es wird KEIN Redim verwendet.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o