Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Alle strings in einem List<string> auf Teilweise gleichen Inhalt überprüfen
scarpall
myCSharp.de - Member



Dabei seit:
Beiträge: 42
Herkunft: Deutschland

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2135

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
scarpall
myCSharp.de - Member



Dabei seit:
Beiträge: 42
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

... oder nur c:\foo - denn das ist die gemeinsame Basis.
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Zitat von ujr
... 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.
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1770

beantworten | zitieren | melden

Ja, stimmt. Hab übersehen, dass die Einträge oben Teil der Liste sind.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von Sir Rufo
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"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)
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Na denn kann man das so handhaben


IEnumerable<string> pathCollection = ...

var filteredCollection = pathCollection.Where( path => !pathCollection.Where( e => path.StartsWith( e + @"\" ) ).Any() ).ToList();
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16098

beantworten | zitieren | melden

Bitte wenn dann Path.DirectorySeparatorChar verwenden.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
scarpall
myCSharp.de - Member



Dabei seit:
Beiträge: 42
Herkunft: Deutschland

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von scarpall am .
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2135

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
CWolle
myCSharp.de - Member

Avatar #avatar-4065.jpg


Dabei seit:
Beiträge: 58
Herkunft: Süddeutschland

Such nach dem zweiten /

beantworten | zitieren | melden

- 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#?
private Nachricht | Beiträge des Benutzers