2017-10-04 144 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