Laden...

Alle strings in einem List<string> auf Teilweise gleichen Inhalt überprüfen

Erstellt von scarpall vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.894 Views
S
scarpall Themenstarter:in
42 Beiträge seit 2012
vor 6 Jahren
Alle strings in einem List<string> auf Teilweise gleichen Inhalt überprüfen

Hallo

vorab schonmal eine Entschuldigung von mir falls ich in dem falschen Bereich gepostet habe.
Ich hatte nur einen 2 Wochen c sharp lehrgang und habe mir den rest den ich bisher kann selbst angeeignet. Deshalb wird der Code warscheinlich auch nicht Tip Top sein.

Also ich habe eine Textdatei die mit verschiedenen Pfaden gefüllt ist.
Diese wird eingelesen in einen List<string> und soll nun auf ähnlichkeit überprüft werden.
Also quasi das wenn in der Textdatei enthalten ist:

C:\Program Files (x86)\VLC
C:\Program Files (x86)\VLC\locale
C:\Program Files (x86)\VLC\lua
C:\Program Files (x86)\VLC\plugins
C:\Program Files (x86)\VLC\skins

Nur der Pfad: C:\Program Files (x86)\VLC weiter bearbeitet wird.
Das Problem ist aber das es viele verschiedene pfade sind und die ja dementsprechend auch unterschiedlich lang sind oder noch mehr Unterordnerebenen haben.

Mir fällt da momentan nichts wirklich ein was ich da testen könnte und auch nicht nach was ich da überhaupt spezifisch googlen sollte.

Ich habe bis jetzt nur vor mal etwas mit string.Compare() zu testen ob sich damit etwas machen lässt.

Vielen Dank schonmal im vorraus
Scarpall

C
2.121 Beiträge seit 2010
vor 6 Jahren

Die Methode StartsWith() eines Strings kennst du?
Deine Frage ist mir überhaupt nicht klar, daher kann ich nichts weiter dazu sagen. Was soll wie passieren?

3.003 Beiträge seit 2006
vor 6 Jahren

Geht mir ähnlich, aber ich rate mal wild: du möchtest die Zeichenketten vergleichen und den Teil, beginnend am Anfang der Zeichenketten, extrahieren, bis zu dem alle identisch sind. Ja?


string [] example = new[] 
{ 
    "auf der mauer auf der lauer", 
    "auf der mauer auf der", 
    "auf der mauer auf", 
    "auf der mauer", 
    "auf der", 
    "auf dem" 
};

string result = DoSomeMagic(example);
//result == "auf "

Lösung:


finde den kürzesten string im array
zaehle rückwärts von der länge des kürzesten strings bis 0 und:
    - extrahiere die Buchstaben von 0 bis zum Zähler aus dem kürzesten String
    - teste alle anderen strings, ob sie mit der extrahierten zeichenkette beginnen
    - wenn nein, zähle weiter rückwärts
    - wenn ja: ergebnis ist die extrahierte Zeichenkette


Viel Spass.

LaTino
EDIT: wenn es sich um Dateipfade handelt, geht das ganze auch schneller, weil man nicht alle Zeichen, sondern nur die Pfade extrahieren muss. Die statische Klasse Path in System.IO hat dafür passende Methoden.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
scarpall Themenstarter:in
42 Beiträge seit 2012
vor 6 Jahren

Also ich nehm jetzt einfach mal ein paar Beispiele aus der Datei und dann wie es danach aussehen soll.
Leider weis ich nicht wie ich das benennen soll.

Pfade unbearbeitet:

C:\Program Files (x86)\VLC
C:\Program Files (x86)\VLC\locale
C:\Program Files (x86)\VLC\lua
C:\Program Files (x86)\VLC\plugins
C:\Program Files (x86)\VLC\skins
C:\Program Files\Office
C:\Program Files\Office\Document Themes 16
C:\Program Files\Office\Document Themes 16\Theme Colors
C:\Program Files\Office\Document Themes 16\Theme Effects
C:\Program Files\Office\Document Themes 16\Theme Fonts
C:\Program Files\Office\Templates
C:\Program Files\Office\Templates\1031
C:\Program Files\Office\Templates\1031\Access
C:\Program Files\Office\Templates\1031\GettingStarted16
C:\Program Files\Office\Templates\Presentation Designs
...

und nach der Bearbeitung dürften dann nur diese Pfade übrig bleiben:

C:\Program Files (x86)\VLC
C:\Program Files\Office

Also sollen quasi alle unterordner pfade entfernt werden.

MfG Scarpall

D
985 Beiträge seit 2014
vor 6 Jahren

Das Vergleichen der Strings bringt leider nicht das (wirkliche) gewünschte Ergebnis, denn es sind eben nicht einfach nur schnöde Strings, sondern Datei-Pfade und darum muss man diese auch wie solche behandeln.

Hier wird auch wieder ein klassischer Fehler beim Erstellen des Vorher-/Nachher-Beispiels gemacht:

Der simpelste Fall wird gezeigt anstatt der mit der höchstmöglichen Komplikation.


c:\foo\a
C:\Foo\A\B
C:\Foo\b
C:\Foo\bb

Was müsste unter Windows herauskommen?


c:\foo\a
C:\Foo\b
C:\Foo\bb

U
1.688 Beiträge seit 2007
vor 6 Jahren

... oder nur c:\foo - denn das ist die gemeinsame Basis.

D
985 Beiträge seit 2014
vor 6 Jahren

... oder nur c:\foo

Nicht in diesem Falle, denn die Anforderung hat er klar definiert, es muss ein Eintrag aus der Liste sein und c:\foo ist in der Liste nicht enthalten.

U
1.688 Beiträge seit 2007
vor 6 Jahren

Ja, stimmt. Hab übersehen, dass die Einträge oben Teil der Liste sind.

3.003 Beiträge seit 2006
vor 6 Jahren

Das Vergleichen der Strings bringt leider nicht das (wirkliche) gewünschte Ergebnis, denn es sind eben nicht einfach nur schnöde Strings, sondern Datei-Pfade und darum muss man diese auch wie solche behandeln.

Hier wird auch wieder ein klassischer Fehler beim Erstellen des Vorher-/Nachher-Beispiels gemacht:

Der simpelste Fall wird gezeigt anstatt der mit der höchstmöglichen Komplikation.

Ich denke, hier kann man ruhig mal die Kirche im Dorf lassen und davon ausgehen, dass er einfach nur ein paar Pfade unter Windows behandeln will. Strenggenommen hast du zwar Recht, aber für das Problem des TE sind die Hinweise eher irre- als zielführend.

EDIT: den Anforderungen kannst du also hinzufügen:
a) die Pfade sind Windows-Pfadangaben
b) jeder Pfad kommt nur einmal vor, Groß- und Kleinschreibung ist unbeachtlich
c) es gibt immer genau einen Eintrag, der der kürzeste ist und als Ergebnis übrig bleiben soll

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

D
985 Beiträge seit 2014
vor 6 Jahren

Na denn kann man das so handhaben


IEnumerable<string> pathCollection = ...

var filteredCollection = pathCollection.Where( path => !pathCollection.Where( e => path.StartsWith( e + @"\" ) ).Any() ).ToList();

16.806 Beiträge seit 2008
vor 6 Jahren

Bitte wenn dann Path.DirectorySeparatorChar verwenden.

S
scarpall Themenstarter:in
42 Beiträge seit 2012
vor 6 Jahren

okay danke für die Antworten ich werde mich gleich mal hinsetzen und etwas damit rumprobieren und gebe euch dann nochmal Feedback bzw. stelle euch dann eventuell nochmal fragen.

Edit: Wow Funktioniert genau so wie es soll!
Vielen vielen dank dafür Sir Rufo!

MfG Scarpall

C
2.121 Beiträge seit 2010
vor 6 Jahren

Hast du das Statement auch verstanden oder funktioniert es und du hoffst du musst das nie wieder ändern 😉
Ich würde da lieber eine handvoll mehr Zeilen schreiben, statt alles in eine zu packen.

57 Beiträge seit 2012
vor 6 Jahren
Such nach dem zweiten /
  • durchsuche jeden String nach dem Index des zweiten "/"
  • nun kannst du einen String generieren von (0-Index)
  • speichere die Strings in einer Collection, dann hast du das Ergebnis

OO gibts seit Platon - hatte der auch C#?