2010-04-28 32 views
3

我想在C#中结合两个相对路径。有没有一种简单的方法来结合C#中的两个相对路径?

例如:

string path1 = "/System/Configuration/Panels/Alpha"; 
string path2 = "Panels/Alpha/Data"; 

我想回到

string result = "/System/Configuration/Panels/Alpha/Data"; 

我可以通过拆分第二阵列实现这一点,它在一个比较for循环,但我想知道是否有类似的东西到Path.Combine可用或如果这可以用正则表达式或Linq完成?

感谢

+5

这有什么错Path.Combine? – 2010-04-28 16:36:18

+0

@Kyle Alons:@loannis希望Combine方法能够识别路径的共享片段并适当地“合并”它们。 – 2010-04-28 16:38:12

+3

Path.Combine将返回“/系统/配置/面板/ Alpha /数据/面板/ Alpha /数据” – Ioannis 2010-04-28 16:39:34

回答

4

只要两个字符串总是在相同的格式,在你的榜样,这应该工作:

string path1 = "/System/Configuration/Panels/Alpha"; 
string path2 = "Panels/Alpha/Data"; 

var x = path1.Split('/'); 
var y = path2.Split('/'); 

string result = Enumerable.Range(0, x.Count()) 

          .Where(i => x.Skip(i) 
             .SequenceEqual(y.Take(x.Skip(i) 
                   .Count()))) 

          .Select(i => string.Join("/", x.Take(i) 
                 .Concat(y))) 

          .LastOrDefault(); 

// result == "/System/Configuration/Panels/Alpha/Data" 

对于path1 = "/System/a/b/a/b"path2 = "a/b/a/b/c"结果是"/System/a/b/a/b/a/b/c"。您可以更改LastOrDefaultFirstOrDefault代替"/System/a/b/a/b/c"


请注意,该算法基本上创建了两个路径的所有可能的组合,并不是特别有效。

+0

+1 ...做得好! – 2010-04-28 16:46:36

+0

谢谢你,这是非常优雅的代码。不想使用。:) – Ioannis 2010-04-28 16:48:10

+1

需要说明的是,您必须*假设*“面板/ Alpha”与“/ System/Configuration/*面板/ Alpha *”是相同的文件夹“ – 2010-04-28 16:49:51

4

我觉得这需要一个先验知识,某些文件夹都是一样的,有些东西你不能安全地从人的路推断(因为它不是绝对的)。

您必须自己编写一些自定义逻辑才能组合这些路径。

+0

+1:没有已知的锚点,同一个名称不一定表示层次结构中的相同文件夹。 – 2010-04-28 16:41:36

+0

假设path1的一部分值总是知道的(例如“/ System/Configuration/....”,这是可能的。 – Ioannis 2010-04-28 16:45:54

+0

@loannis,但这需要你知道*有一定量的重叠,并且您的文件夹结构不包含其他具有相似名称的路径。 – 2010-04-28 16:48:40

1

尝试......

var p1 = path1.Split('/'); 
var p2 = path2.Split('/'); 

result = p1.Union(p1); 

它使用System.Linq的,并且可以很容易地打包成一个扩展方法。

当然,它假设一些关于path1和path2的值。

+0

虽然我的解决方案可能并不完美,但对于更多情况,这种方法会失败。例如,如果'path1 =“/ System/Panels/Configuration/Panels/Alpha”和'path2 =“Panels/Alpha/Data”,结果是“/ System/Panels/Configuration/Alpha/Data” 。 – dtb 2010-04-28 16:52:53

+0

同意...虽然确实如此,但无法提供“最适合”解决方案而无需其他上下文。 – pblasucci 2010-04-28 16:58:58

0

Path.GetFullPath(Path.Combine(PATH1,PATH2))

GetFullPath将合并并简化得到的路径。

编辑:没关系,只适用于绝对路径...

相关问题