2017-10-04 195 views
0

我有關於https://en.wikipedia.org/wiki/Longest_common_substring_problem一個問題,我的源集合包含的並不總是都有一個共同的路徑(的C外:\有時候會)的文件路徑列表例如:從分組文件路徑集合中提取公共路徑?

源集合:

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 

輸出應該是一個集合:

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

如何找到每個文件路徑「羣」的共同路徑?我在這裏找到了很多解決方案,但它總是與至少共享一個公用目錄的文件路徑集合在一起,而這裏並不是這種情況。

+1

爲什麼'C:\ Test \ Root \ Common \ Data \ Home \「不成爲輸出的一部分? – maccettura

+0

爲什麼不是C:\和D:\? – Valerii

+0

@maccettura因爲前3個路徑的常用文件夾是C:\ Test \ Root \ Common \ Data – Coloris

回答

1

我仍然不知道我理解正確的問題...

我希望這會工作。

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

謝謝@Valerii,它幾乎完美,只是如果只有一個文件路徑的實例,它將返回完整的文件名D:\ Data \ a.txt,而不僅僅是D:\ Data – Coloris

+0

我已經修復了我的解決方案 – Valerii

+0

謝謝,要深入你的代碼來理解邏輯:) – Coloris