Ein Array aus einer Class per Return zurückgeben

  • C#

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

    Ein Array aus einer Class per Return zurückgeben

    Moin in die runde,

    Kurz und knapp:
    Wie kann ich ein Array, welches in einer Klasse erzeugt wurde, per Return, zurückgeben um es dort weiter zu verarbeiten?

    P.S.:
    Das ist manchmal wie verhext... immer wenn ich hier eine fragte stelle, finde ich ein paar Minuten später die Lösung... das hier kann gerne gelöscht werden.

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

    Pardasus schrieb:

    gelöscht
    Gelöscht nicht.
    Schreib Deine Lösung auf, damit sie gefunden werden kann. ;)
    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!
    Vielleicht doch ganz gut das es noch nicht gelöscht wurde ;)

    Folgendes Funktioniert wunderbar

    Die Klasse

    C#-Quellcode

    1. class Test
    2. {
    3. private string _Verzeichnis;
    4. public Test(string Verzeichnis)
    5. {
    6. _Verzeichnis = Verzeichnis;
    7. }
    8. public string[] Dateinamen()
    9. {
    10. string[] Dateien = Directory.GetFiles(_Verzeichnis);
    11. return Dateien;
    12. }
    13. }


    Main

    C#-Quellcode

    1. Test DateiListe = new Test(@"c:\Test\");
    2. string[] Dateinamen = DateiListe.Dateiname();
    3. for(int i = 0; i < Dateiname.Length; i++ )
    4. {
    5. TreeView1.Nodes.Add(Dateiname[i]);
    6. }


    Soweit ist alles Super! Später wird in der Klasse selbst noch ein paar Dinge mit den Dateinamen angestellt, dies ist nur erst einmal ein Machbarkeit-Test für mich.

    So schön es auch läuft, kann ich mit den zurück gegebenen Daten nix anfangen da sie mit den Kompletten Path zurück gegeben werden. Ist ja kein Problem, dachte ich mir, nimmst de halt ein anderen Befehl der nur den Dateinamen zurück gibt.

    In der Klasse Tausche ich Direcotry.GetFiles etc. gegen diese hier aus:

    C#-Quellcode

    1. string[] FileName;
    2. DirectoryInfo myDir = new DirectoryInfo(_Verzeichnis);
    3. FileInfo[] Dateien = myDir.GetFiles();
    4. for (int i = 0; i < Dateien.length; i++)
    5. {
    6. FileName[i] = Dateien[i].name;
    7. }
    8. return FileName;

    Aber das will nicht Funktionieren, da er diese nicht in ein Array umwandeln kann?!... jetzt brauche ich doch Hilfe :)
    Ja sehr schön! Vielen dank!

    C#-Quellcode

    1. private string[] FileName;
    2. ...
    3. DirectoryInfo myDir = new DirectoryInfo(_Verzeichnis);
    4. FileInfo[] Dateien = myDir.GetFiles();
    5. FileName = new string[Dateien.length];
    6. for (int i = 0; i < Dateien.length; i++)
    7. {
    8. FileName[i] = Dateien[i].name;
    9. }
    10. return FileName;


    Aber kann ich auch Dateien[].name komplett in FileName[] rüberschieben ohne die For-Schleife? Brauche ich überhaupt eine For-Schleife?!
    Also ich würde sagen ja Du brauchst die For Schleife, weil Dateien enhält ja noch viel mehr als die Dateinamen - z.B.: "Dateien(i).DirectoryName" und zudem ist Dateinamen vom Typ FileInfo und nicht vom Typ String.

    Aber wahrscheinlich gibt es irgendeinen "verrückten" Lamda-Ausdruck, der dies in einem Rutsch erledigt, wobei der Lambda-Ausdruck in der Regel dann ja auch eine For-Schleife enthält.

    Edit: @Pardasus: Doch es geht mit Linq - ich muss mich selber Lügen strafen - allerdings wird dabei eher "Dateien" aber auch "myDir" überflüssig!

    C#-Quellcode

    1. string[] FileName = Directory.GetFiles(_Verzeichnis).Select(FullName => Path.GetFileName(FullName)).ToArray();

    VB.NET-Quellcode

    1. Dim FileName As String() = Directory.GetFiles(_Verzeichnis).[Select](Function(FullName) Path.GetFileName(FullName)).ToArray()


    Der Code macht natürlich nichts anders als:

    C#-Quellcode

    1. DirectoryInfo myDir = new DirectoryInfo(_Verzeichnis);
    2. FileInfo[] Dateien = myDir.GetFiles();
    3. string[] FileName = new string[Dateien.Length];
    4. for (int i = 0; i <= Dateien.Length - 1; i++) {
    5. FileName[i] = Dateien[i].FullName;
    6. }

    VB.NET-Quellcode

    1. Dim myDir As New DirectoryInfo(_Verzeichnis)
    2. Dim Dateien As FileInfo() = myDir.GetFiles()
    3. Dim FileName(Dateien.Length - 1) As String
    4. For i As Integer = 0 To Dateien.Length - 1
    5. FileName(i) = Path.GetFileName(Dateien(i).FullName)
    6. Next


    Editiert: Runde Klammern durch eckige Klammern ersetzt - und vereinfachter Code ohne "ToArray" und "Convert" - Hinweis von @ErfinderDesRades

    Dieser Beitrag wurde bereits 19 mal editiert, zuletzt von „Thias“ ()

    Selbstverständlich!

    Aber @Pardasus gibt ja in seinem Return String[] zurück.

    C#-Quellcode

    1. private string[] FileName;
    2. ...
    3. return FileName;


    "FileInfo" wird ja in seiner (längeren) Routine wieder nach String[] umgearbeitet - und dies wollte er vereinfachen.

    Oder worauf willst Du hinaus? - Kann nämlich sein, dass ich noch nicht richtig wach bin!
    Oder sollte dies nur ein allgemeiner Hinweis sein? - Für Leute die nicht wie ich die halbe Nacht die Directory- und Path-Klasse angeschaut haben? :)

    Edit @ErfinderDesRades: Stimmt - VB.Net-Snppet funktioniert bei mir - aber C# scheint falsch übersetzt -schaue ich mir gerade an!

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

    Danke für den Hinweis - muss natürlich statt mit runden mit eckigen Klammern sein - vergess ich jedesmal beim Übersetzen - egal in welche Rrichtung.

    C#-Quellcode

    1. FileName[i] = Convert.ToString(Path.GetFileName(Dateien[i].FullName).ToArray());

    Folgendes hatte ich am Anfang des Snippets auch weggelassen, weil im Gesamtkontext des Threades eigentlich klar:

    C#-Quellcode

    1. string _Verzeichnis = "C:\\MyDir";


    Und die Chars werden noch nicht richtig zu String umgesetzt - im Gegensatz zu VB.Net fehlt da in C# also leider immer noch etwas. :(

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Thias“ ()

    Nochmals Danke - oben ist es korrigiert!

    Spoiler anzeigen
    a) hatte ich mich durch

    C#-Quellcode

    1. string[] FileName = Directory.GetFiles(_Verzeichnis).Select(FullName => Path.GetFileName(FullName)).ToArray();

    in die Irre führen lassen, dass ich auch in der For-Schelife das ".ToArray()" benötige

    b) habe ich dann aus VB.Net

    VB.NET-Quellcode

    1. FileName(i) = CType(Path.GetFileName(Dateien(i).FullName).ToArray(), String)

    folgendes falsches gemacht:

    C#-Quellcode

    1. FileName[i] = Convert.ToString(Path.GetFileName(Dateien[i].FullName).ToArray())

    Dies hätte funktioniert:

    C#-Quellcode

    1. FileName[i] = new string(Path.GetFileName(Dateien[i].FullName).ToArray());

    aber natürlich zu umständlich! :(

    Aber nun zumindest etwas über Konvertierung von Char[] nach String in C# gelernt. :)

    Bzw. auch gelernt, dass man in VB.Net in dem Fall (mit dem umständlichen ".ToArray() ") auch folgendes schreiben könnte statt CType:

    VB.NET-Quellcode

    1. FileName(i) = New String(Path.GetFileName(Dateien(i).FullName).ToArray())


    Thias schrieb:

    aber natürlich zu umständlich!

    wohl wahr.
    Einfach die FileInfo-Klasse angucken, und erkennen, dass .FullName bereits ein String ist.
    Da gibt es keinen Grund, diesen in ein Char-Array zu konvertieren, und aus dem Char-Array wieder einen String zu bilden.
    Es ist doch schon der String, der gewünschte.

    Die alte Leier: Datentypen Datentypen Datentypen - Wissen, mit welchen Datentypen man arbeitet, und sinnvoll einsetzen.
    Jou.
    Und dann ggf. noch überlegen, ob man mit einem Array T() oder einer List(Of T) arbeiten sollte, denn einer List ist die Anzahl der Member egal, bei einem Array muss da aufgepasst werden.
    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!
    Jetzt mal davon abgesehen, dass evtl. eine List(Of T) besser geeignet wäre, habe ich die Frage welchen Code die "Profis" denn eher nutzen würden.

    C#-Quellcode

    1. string[] FileName = Directory.GetFiles(_Verzeichnis).Select(FullName => Path.GetFileName(FullName)).ToArray();

    oder doch die For-Schleife?

    Weil dies war ja die Frage von @Pardasus, ob er die For-Schleife ersetzen könnte - nun er kannn - aber ist es ratsam? Oder ist es egal?
    ich bevorzuge DirectoryInfo, FileInfo ganz stark, also sähe es evtl. so aus:

    C#-Quellcode

    1. string[] FileNames = new DirectoryInfo(_Verzeichnis).GetFiles().Select(fi => fi.FullName).ToArray();


    Allerdings würde ich annähernd nie mir ein string[] von Dateinamen erstellen, weil ich hab eh ein FileInfo[], und das ist eh viel mächtiger, warum sollte ich das in ein dummes string[] konvertieren?

    C#-Quellcode

    1. FileInfo[] Files = new DirectoryInfo(_Verzeichnis).GetFiles();
    feddich.

    Falls es in eine Listbox soll: Keine Strings in die File-Listbox!