2017-10-04 5 views
0

Ich habe eine Frage im Zusammenhang mit https://en.wikipedia.org/wiki/Longest_common_substring_problem, enthält meine Quellensammlung eine Liste von Dateipfaden, die nicht immer einen gemeinsamen Weg (außerhalb des C: \ fahren manchmal) teilen ex:Extrahieren Sie den allgemeinen Pfad aus einer Sammlung von gruppierten Dateipfaden?

Quelle Sammlung:

C:\Test\Root\Common\Data\a.txt 
C:\Test\Root\Common\Data\Home\b.txt 
C:\Test\Root\Common\Data\Home\Dev\c.txt 
C:\Test2\Random\Data\a.txt 
C:\Test2\Random\b.txt 
C:\Test2\c.txt 
D:\Data\a.txt 

Ausgabe sollte eine Sammlung sein:

C:\Test\Root\Common\Data\ 
C:\Test2\ 
D:\Data\ 

Wie den gemeinsamen Pfad jeder „Gruppe“ von Dateipfaden zu finden? Ich habe hier viele Lösungen gefunden, aber es ist immer mit einer Sammlung von Dateipfaden, die mindestens ein gemeinsames Verzeichnis teilen, was hier nicht der Fall ist.

+1

Warum sollte "C: \ Test \ Root \ Common \ Data \ Home" nicht Teil der Ausgabe sein? – maccettura

+0

Warum nicht C: \ und D: \? – Valerii

+0

@maccettura weil der gemeinsame Ordner für die ersten 3 Pfade C: \ Test \ Root \ Common \ Daten – Coloris

Antwort

1

Ich bin immer noch nicht sicher, dass ich Problem richtig verstehe ...

Ich hoffe, dass dies funktionieren wird.

public List<string> ExtractCommonPaths(List<string> paths) 
    { 
     var separatedImput = paths 
      .Select(path => path.Split(new [] {":\\", "\\" }, StringSplitOptions.RemoveEmptyEntries)) 
      .Select(path => path.Take(path.Length - 1).ToList()); 
     return separatedImput.GroupBy(path => path[0] + ":\\" + path[1]) 
      .Select(g => 
      { 
       var commonPath = g.Key; 
       var commpoPathLength = 2; 
       for (;;) 
       { 
        var exit = false; 
        var pathItem = string.Empty; 
        foreach (var path in g) 
        { 
         if (path.Count <= commpoPathLength) 
         { 
          exit = true; 
          break; 
         } 

         if (pathItem == string.Empty) 
          pathItem = path[commpoPathLength]; 
         else 
         { 
          if (pathItem != path[commpoPathLength]) 
          { 
           exit = true; 
           break; 
          } 
         } 
        } 

        if (exit) 
         break; 
        commonPath += "\\" + pathItem; 
        commpoPathLength++; 
       } 

       return commonPath; 
      }) 
      .ToList(); 
    } 
+0

Danke @Valerii, es ist fast perfekt, nur wenn es nur eine einzige Instanz eines Dateipfads gibt, gibt es den vollständigen Dateinamen D: \ Data \ a.txt statt nur D: \ Data – Coloris

+0

Ich habe meine Lösung – Valerii

+0

Vielen Dank , werde in deinen Code graben, um die Logik zu verstehen :) – Coloris

Verwandte Themen