Zeilen zu einer Collection hinzufügen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Zeilen zu einer Collection hinzufügen

    Hi,

    Ich erstelle eine LIste von FileNamen auf die übliche Weise:

    VB.NET-Quellcode

    1. Dim fileList = My.Computer.FileSystem.GetFiles(LoadDirectory)


    Das ist ja wohl eine Kurzschreibweise für die ausführliche Definition

    VB.NET-Quellcode

    1. Dim fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = My.Computer.FileSystem.GetFiles(LoadDirectory)


    fileList ist also eine ReadOnlyCollection(Of String)

    Jetzt würde ich dieser Collection gern einen weiteren String hinzufügen, etwa "C:\Windows".

    Aber wie mache ich das? Eine Methode .Add oder .AddItem etc. kann ich beim besten Willen nicht finden.

    Allein die Methode .ToArray erlaubt es mir, die Collection in einen 1-dimensionalen Array umzuwandeln. Aber leider kennt auch ein Array keine .Add Methode. Das geht nur mit einer List(Of String) ... Die Collection kennt aber keine Methode .ToListOfString

    So wie ich das sehe bleibt mir also nix anderes übrig, als die Collection mit .ToArray in einen Array umzuwandeln, den Array dann mit Redim zu erweitern und dann den neuen String über den Index in den Array einzustellen.

    Ein ganz schöner Verhau!

    Geht das nicht irgendwie eleganter? Kann man einer Collection(Of String) nicht "unmittelbar" einen weiteren String hinzufügen? Na, ich bin überzeugt, dass den Kennern der Objektorientierung da doch noch etwas einfällt!

    LG
    Peter

    Peter329 schrieb:

    einfällt
    Jawoll Sir! :thumbsup:

    VB.NET-Quellcode

    1. Dim fileList = My.Computer.FileSystem.GetFiles("C:\Temp\Test\Test\").ToList()
    2. fileList.Add("C:\Windows\test.cmd")
    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!
    Suuuuupiiiii ! Ich habe einfach gewusst, dass ihr das wisst! :)

    Mein Coding sieht jetzt wie folgt aus:

    VB.NET-Quellcode

    1. Dim fileList As System.Collections.ObjectModel.ReadOnlyCollection(Of String) = _
    2. My.Computer.FileSystem.GetFiles(LoadDirectory, FileIO.SearchOption.SearchTopLevelOnly, "*.exe")
    3. Dim fileList2 As System.Collections.Generic.List(Of String) = fileList.ToList()
    4. fileList2.Add("C:\Windows\System32\cmd.exe")
    5. For Each filename In fileList2
    6. MessageBox.Show(filename)
    7. Next


    Ich hab mal überall explit den Typ der Variablen mit vermerkt. Damit ich weiß, wovon ich rede. Der Trick ist wohl der, dass man aus der ReadOnlyCollection(Of String) eine Generic.List(Of String) macht. Und da gibt es dann die Methode .Add.

    Das funktioniert jetzt soweit hervorragend. Allein ich hab dazu den Namespace Microsoft.VisualBasic aktivieren müssen. Und das ist ja bekanntlich ein "no go"

    Das Problem:

    Die Enumeration FileIO.SearchOption.SearchTopLevelOnly wird sonst nicht gefunden.

    Ich hätte, vermutet, dass es ausreicht den Namespace Microsoft.VisualBasic.FileIO zu aktivieren. Aber das ist merkwürdigerweise NICHT der Fall. Der Fehler verschwindet erst, wenn ich Microsoft.VisualBasic aktiviere. Aber das traue ich mich inzwischen gar nicht mehr! :)

    Also ... wie ist diese Kiste nach Meinung der Großmeister des .NET Frameworks jetzt zu behandeln.

    LG
    Peter

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

    Erstmal "My.Computer" restlos entsorgen, das ist noch aus der Steinzeit.
    GetFiles gibts in der aktuellen Variante in "System.IO".
    Dann ist auch gleich eine funktionierende SearchOption dabei.

    Dim fileList = System.IO.Directory.GetFiles(path:="c:\Windows", searchPattern:="*.exe", searchOption:=IO.SearchOption.TopDirectoryOnly)
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!

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

    Ok ... damit geht es ohne den Microsoft.Visualbasic Namespace. Mein Coding sieht jetzt wie folgt aus:

    VB.NET-Quellcode

    1. 'Get all .exe files
    2. Dim fileList As String() = System.IO.Directory.GetFiles(path:=LoadDirectory,
    3. searchPattern:="*.exe",
    4. searchOption:=IO.SearchOption.TopDirectoryOnly)
    5. Dim fileList2 As System.Collections.Generic.List(Of String) = fileList.ToList() 'Requ. to .Add strings
    6. 'Include special programs
    7. For Each FileName In IncludeProgramList
    8. If File.Exists(FileName) Then fileList2.Add(FileName)
    9. Next
    10. For Each foundFile As String In fileList2
    11. ...


    Ich hoffe, jetzt ist alles im Sinne der reinen Lehre ...

    LG
    Peter
    naja, mit FileInfos kann man normalerweise viel besser arbeiten als mit dumme Strings, wie System.IO.Directory.GetFiles() sie zurückgibt.

    Aber ich weiß ja nicht, was du im Weiteren damit vorhast, vlt. willst du ja nix anderes als die ganzen langen Dateinamen als Strings.

    also falls du mal gugge wolle, mit FileInfo, Databinding und so: Keine Strings in die File-Listbox!