Gewinde Geschrieben 4. November 2023 Geschrieben 4. November 2023 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 Zitieren
tkreutz2 Geschrieben 5. November 2023 Geschrieben 5. November 2023 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. Zitieren
Gewinde Geschrieben 5. November 2023 Autor Geschrieben 5. November 2023 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 Zitieren
Whiz-zarD Geschrieben 5. November 2023 Geschrieben 5. November 2023 (bearbeitet) 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 5. November 2023 von Whiz-zarD SoL_Psycho reagierte darauf 1 Zitieren
Gewinde Geschrieben 7. November 2023 Autor Geschrieben 7. November 2023 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 👍 Zitieren
Empfohlene Beiträge
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.