Zum Inhalt springen

Ordnerstrukturen zur Datenverarbeitung mit LINQ durchlaufen


Gewinde

Empfohlene Beiträge

Hallo zusammen,

ich muss für mein Programm über eine Eingabeoption durch einen Stringvergleich nach bestimmten Ordnern bzw. Daten suchen. Da ich dafür in den Unterordnern der Ordner und von den Unterordnern wieder in allen Unterordnern suchen muss, gestaltet sich der Zugriff recht unkomfortabel. Bis jetzt gehe ich vom obersten Ordner mittels DictionaryInfo[] nextDir = previous.GetDictionaries(); mit nachträglicher Foreachschleife immer weiter in die Hierarchie rein. Diese Variante funktioniert an und für sich gut, auch einen späteren Datenzugriff bekomme ich damit realisiert. Da ich diese Variante allerdings recht ungeschickt finde, würde ich gerne eine etwas effizientere Lösung anstreben. Soweit ich mal gelesen habe, ist es möglich mittels Linq sehr gut Ordnerstrukturen zu durchsuchen. Wie man zwei verschiedene Listen mittels Join o.ä. verbindet konnte ich bis jetzt überall finden, dies wäre aber nicht das was ich benötige. Ich muss einen Ordner öffnen, dann in diesem Ordner nachsehen ob die Eingabe mit den Ordnernamen übereinstimmen, wenn nicht dann in jeden weiteren Ordner dieses Ordners hinein und dort wieder den Vergleich anstellen. Wenn dann der Ordner gefunden wurde, dessen Name mit der Eingabe übereinstimmt. Dann muss ich in diesen Ordner, um dort 1. alle Dateien anzuzeigen und 2. einen Stringvergleich anstellen und alle Dateien bei denen Teile des Namens mit einer vorherigen Zeichenauswahl übereinstimmen zur Weiterverarbeitung in eine dafür vorgesehene Liste zu speichern.

Hat vielleicht jemand eine Idee wie man dies mittels Linq o.ä. sauber und effizient lösen könnte, ohne tausende von Foreachschleifen durchlaufen zu müssen?

Mit freundlichen Grüßen Gewinde

Link zu diesem Kommentar
Auf anderen Seiten teilen

In Bezug auf Performance Tests, vielleicht hilft es, mal ein paar Werte zu messen, vergleichbar dem Ansatz. (Auf der Website findet man auch sonst zu vielen Themen und um .NET viele Beispiele- und Ansätze).

https://www.codeproject.com/Articles/5345621/LINQ-and-Performance

Zu der eigentlichen Frage kann ich leider aus dem Bauch raus nichts sagen, da ich aktuell auf anderen Plattformen unterwegs bin.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich habe jetzt mit einigem Hin und Her eine Lösung gefunden. Ob dies die Ideallösung unter Nutzung von Linq ist weiß ich nicht. Vielleicht hat jemand doch noch eine bessere Lösung oder aber kann diese Variante guten Gewissens abnicken. So ganz zufrieden bin ich damit noch nicht. Vielleicht bekomme ich es mit der Syntax noch besser hin. Wenn ich die Syntax richtig verstehe gehe ich gleich die ersten Ordnerstrukturen ohne großartige Suchvorgänge durch. Besser fände ich es, wenn er in jedem Ordner einmal nach den gewünschten Ordnernamen sucht. Dafür muss ich aber mit der Syntax noch etwas wärmer werden denke ich.

@tkreutz2 Danke für deine Antwort, dass Linq teilweise nicht die schnellste Möglichkeit ist war mir schon bekannt, ich glaube der Vorteil von Linq ist einmal die übersichtliche Syntax, Kompatibilität und das der eigentliche Vorgang erst mit auslösen der Foreachschleife gestartet wird? Irgendwie so habe ich das mal gelesen, bin mir jetzt aber nicht sicher ob die Aussage wirklich korrekt ist. Des weiteren sind natürlich die fülle von eingebauten Such- und Filterfunktionen ein enormer Vorteil. 

DirectoryInfo directory = new DirectoryInfo(Path);

var query = from dir in directory.GetDirectories()
            from dir2 in dir.GetDirectories()
            from dir3 in dir2.GetDirectories()
            where dir3.Name.Equals(orderNumber)
            from file in dir3.GetFiles()
            select file;

            foreach (var file in query)
            {
               collectedFiles.Add(file);
            }

Am Ende werden die Daten des Zielordners in einer Liste geparkt und über eine ObservableCollection aus dem ViewModel ans UI übergeben.

Für Tipps und Tricks bin immer dankbar ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielleicht solltest du dir mal die Dokumentation von GetDictionaries() genauer durchlesen. ;)
GetDictionaries() hat ein Parameter, womit du alle Unterordner einbeziehen kannst.

https://learn.microsoft.com/en-us/dotnet/api/system.io.directoryinfo.getdirectories?view=net-7.0

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

Hey,

danke für deine Antwort. Ich habe mir die Dokumentation von DirectoryInfo zwar durchgelesen, aber wie es aussieht ist der Teil an mir vorüber gegangen. Ich werde das dort geschriebene mal umsetzen, erstmal liest es sich so, als wäre es genau das was ich mir vorgestellt habe.

mal wieder an Dank an dieses Forum 👍

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...