| Autor |
Beitrag |
Holonet
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.10.11 14:59
Hallo zusammen.
Ich bin total neu in C# und .NET und habe nur wenig Java-Erfahrung. Ich bin in Ausbildung und hab ein kleines Projekt zum bearbeiten, stecke jetzt aber fest und mein Betreuer ist krank.
Ich will eine Liste von allen Dateien haben, die sich in einem Verzeichnis befinden.
Dieses Verzeichnis wird durch einen folderBrowserDialog ausgewählt, in ein Textfeld gespeichert und dann zu einem String konvertiert und an eine Klasse übergeben, die dieses dann auslesen soll.
C#-Quelltext 1: 2: 3: 4:
| if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { this.txtPath.Text = folderBrowserDialog1.SelectedPath; ListManager myListManager = new ListManager(this.txtPath.Text.ToString()); |
Im Konstruktor der Klasse will ich dann ein Array erstellen, dass alle Dateien des ausgewählten Verzeichnisses enthält und eine Methode programmieren, die die "Name"-Eigenschaft dieses Array vom Typ FileInfo in ein String-Array konvertiert, so dass ich den Dateinamen danach mit meinem Modell abgleichen kann.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| public ListManager(string path) { DirectoryInfo content = new DirectoryInfo(path); FileInfo[] files = content.GetFiles();
} |
Ich hab jetzt aber keinen Schimmer, wie ich weitermachen soll. Ich hab ein paar Tutorials gelesen, die haben mich aber auch nicht weiter gebracht. Könnt ihr mir einen schlauen Input geben?
|
|
gfoidl
      
Beiträge: 157
Erhaltene Danke: 19
Win XP
C#, Fortran 95 - Visual Studio
|
Verfasst: Do 20.10.11 15:23
Hallo,
du kannst auch die Directory.GetFiles-Methode verwenden, diese gibt gleich ein string[] zurück.
Sonst kannst du z.B. mittels LinQ das string-Array erzeugen:
C#-Quelltext 1: 2: 3: 4:
| DirectoryInfo content = new DirectoryInfo(path); FileInfo[] files = content.GetFiles();
string[] fileNames = files.Select(f => f.Name).ToArray(); |
mfG Gü
_________________ Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Für diesen Beitrag haben gedankt: Holonet
|
|
Holonet 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.10.11 15:54
Danke, funktioniert tadellos.
C#-Quelltext
Ich nehme an das ist LINQ? Für was steht das kleine f?
|
|
dark-destination1988
      
Beiträge: 178
Erhaltene Danke: 21
|
Verfasst: Do 20.10.11 16:01
das ist ein parameter und steht praktisch für ein element in der liste
|
|
Holonet 
Hält's aus hier
Beiträge: 15
|
Verfasst: Do 20.10.11 16:16
Ich wollte jetzt einfach mal testweise den 1. Arrayeintrag in einem Labelfeld anzeigen und hab dazu folgenden Code geschrieben:
C#-Quelltext 1: 2: 3:
| ListManager myListManager = new ListManager(this.txtPath.Text.ToString());
lblTest.Text = myListManager.showArray(); |
Dazu die Methode:
C#-Quelltext 1: 2: 3: 4:
| public string showArray(string[] fileNames) { return fileNames[0]; } |
Logischerweise meckert nun der compiler, dass da Methodenkopf und Aufruf nicht übereinstimmen. Aber was muss ich da mitgeben? fileNames ist ja im Objekt myListManager enthalten und wenn ich bei der Methode den Parameter rausnehme kennt er das Array gar nicht mehr in der Methode.
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 20.10.11 18:55
Hallo Holonet,
du mußt aus "fileNames" eine Membervariable deiner Klasse machen:
C#-Quelltext 1:
| private string[] fileNames; |
Und im Konstruktor dann diese Membervariable füllen (anstatt eine lokale Variable anzulegen):
C#-Quelltext 1:
| fileNames = files.Select(f => f.Name).ToArray(); |
|
|
Holonet 
Hält's aus hier
Beiträge: 15
|
Verfasst: Fr 21.10.11 11:17
Ihr seid super. Ich hoffe ich darf euch noch etwas mehr belästigen.
Ich will nun das string-Array auf einen bestimmten Datentyp hin durchsuchen. Und wo wir doch schon mit LinQ angefangen haben, kann man die Sache wohl auch damit beenden.
Ich hab mal versucht ne Query zusammenzubasteln, die mir alle Dateien mit der Endung ".csv":
C#-Quelltext 1:
| var result = (from f in fileNames where f.Contains(".csv") select f).ToArray(); |
Klappt auch soweit, in result werden alle *.csv-Dateien gespeichert.
Ich versteh aber nicht so richtig was das "var result" nun ist. Ne Variable vom Typ, der halt grade gebraucht wird?
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 21.10.11 11:51
| Zitat: | | Ich versteh aber nicht so richtig was das "var result" nun ist. Ne Variable vom Typ, der halt grade gebraucht wird? |
Nicht ganz. Var ist oft nur ein ~Platzhalter~ um Schreibarbeit zu sparen. Wenn der zugewiesene Typ schon zur Designzeit eindeutig bestimmbar ist. Bei deinem rechten Ausdruck kommt garantiert ein string[] raus also kann man sich es sparen das auch explizit als Typ hinzuschreiben und kann einfach var benutzen. Nach dem kompilieren ist var durch den konkreten Typ (string[]) ersetzt. Wenn du dein Kompilat disassemblieren würdest würdest du also nirgendwo ein var Typ finden.
Bei Linq wirst du häufiger var sehen da Linq mit anonymen Typen hantiert. Heißt der Typ ist zwar zur Designzeit eindeutig du kannst ihn aber nicht benennen (wie bei anonymen Dingen zu erwarten) und musst dann halt stattdessen var verwenden . Beispiel zu deinem Beispiel.
C#-Quelltext 1:
| var result = (from f in fileNames where f.Contains(".csv") select new { f, "ist ein CSV" }); |
Nun kommt als Ergebnis ein Neuer Typ bestehend aus deinem f und einen Text zurück. Du hast keine Chance ihn konkret zu benennen da dieser neue Typ(Klasse) noch keinen Namen hat. Bist also gezwungen var zu verwenden.
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 21.10.11 11:58
Hallo Holonet,
ja, bei "var" ersetzt der Compiler den konkreten Typen selber (anhand des Rückgabetyps auf der rechten Seite), s.a. var (C#-Referenz)
Gerade bei Linq kommt als Rückgabe häufig ein IEnumerable<T> bzw. IQueryable<T> heraus - und damit man dies sowie den konkreten Typ 'T' nicht immer als Programmierer selber hinschreiben muß, wurde das "var"-Schlüsselwort zur Sprache hinzugefügt (und bei anonymen Typen gibt es auch keine andere Möglichkeit, als "var" zu benutzen).
Zu exzessiv würde ich "var" jedoch nicht benutzen, da man dann das Programm nicht mehr so einfach versteht.
In deinem Fall wird ja aufgrund von "ToArray()" wieder ein "string"-Array zurückgeliefert, d.h.
C#-Quelltext 1:
| string[] result = (from f in fileNames where f.Contains(".csv") select f).ToArray(); |
wäre die manuelle Ersetzung.
Edit: das war ich wohl zu langsam...
|
|
Holonet 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mo 24.10.11 13:30
Weiter im Text... auch wenn es eigentlich nicht meh viel mit dem eigentlichen Thema des Threads zu tun hat.
Ich habe nun alle Dateien des Verzeichnisses gefiltert und in ein CheckListBox eingefügt. Dort soll der Benutzer nun die Dateien anhaken, die er konvertieren will. Über das Event "ItemCheck" will ich diese nun in ein weiteres Array abfüllen, dass ich dann einem Objekt übergeben kann, dass es in ein anderes Dateiformat umbenennt.
Dafür hab ich folgenden Code verwendet:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void lstbxContent_ItemCheck(object sender, ItemCheckEventArgs e) { if (e.NewValue == CheckState.Checked) { selectedList.Items.Add(lstbxContent.SelectedItem.ToString()); } else { selectedList.Items.Remove(lstbxContent.SelectedItem.ToString()); } } |
Da bekomm ich den Fehler an der "selectedList.Items...."-Stellen, da selectedList ja kein Objekt ist. Und jetzt steh ich grad total auf dem Schlauch, wie ich das in ein Array abfüllen kann.
Habs auch mal mit LinQ versucht:
C#-Quelltext 1:
| selectedList = (from c in lstbxContent where c. select c).ToArray(); | Da komm ich bei der where-Klausel aber nicht weiter.
|
|
Th69
      

Beiträge: 4805
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 24.10.11 17:31
Bitte erstelle dafür ein neues Thema mit sinnvollem Titel, da es nichts mehr mit diesem (und dessen Titel) zu tun hat. Ich werde dann diese Beiträge daraus löschen...
|
|
Holonet 
Hält's aus hier
Beiträge: 15
|
Verfasst: Mi 26.10.11 11:23
Konnte diese Problem lösen. Danke für eure Hilfe.
|
|