有没有一种简单的方法来结合C#中的两个相对路径?
我想在C#中结合两个相对路径。有没有一种简单的方法来结合C#中的两个相对路径?
例如:
string path1 = "/System/Configuration/Panels/Alpha";
string path2 = "Panels/Alpha/Data";
我想回到
string result = "/System/Configuration/Panels/Alpha/Data";
我可以通过拆分第二阵列实现这一点,它在一个比较for循环,但我想知道是否有类似的东西到Path.Combine
可用或如果这可以用正则表达式或Linq完成?
感谢
只要两个字符串总是在相同的格式,在你的榜样,这应该工作:
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"
。您可以更改LastOrDefault至FirstOrDefault代替"/System/a/b/a/b/c"
。
请注意,该算法基本上创建了两个路径的所有可能的组合,并不是特别有效。
+1 ...做得好! – 2010-04-28 16:46:36
谢谢你,这是非常优雅的代码。不想使用。:) – Ioannis 2010-04-28 16:48:10
需要说明的是,您必须*假设*“面板/ Alpha”与“/ System/Configuration/*面板/ Alpha *”是相同的文件夹“ – 2010-04-28 16:49:51
我觉得这需要一个先验知识,某些文件夹都是一样的,有些东西你不能安全地从人的路推断(因为它不是绝对的)。
您必须自己编写一些自定义逻辑才能组合这些路径。
+1:没有已知的锚点,同一个名称不一定表示层次结构中的相同文件夹。 – 2010-04-28 16:41:36
假设path1的一部分值总是知道的(例如“/ System/Configuration/....”,这是可能的。 – Ioannis 2010-04-28 16:45:54
@loannis,但这需要你知道*有一定量的重叠,并且您的文件夹结构不包含其他具有相似名称的路径。 – 2010-04-28 16:48:40
尝试......
var p1 = path1.Split('/');
var p2 = path2.Split('/');
result = p1.Union(p1);
它使用System.Linq的,并且可以很容易地打包成一个扩展方法。
当然,它假设一些关于path1和path2的值。
Path.GetFullPath(Path.Combine(PATH1,PATH2))
GetFullPath将合并并简化得到的路径。
编辑:没关系,只适用于绝对路径...
这有什么错Path.Combine? – 2010-04-28 16:36:18
@Kyle Alons:@loannis希望Combine方法能够识别路径的共享片段并适当地“合并”它们。 – 2010-04-28 16:38:12
Path.Combine将返回“/系统/配置/面板/ Alpha /数据/面板/ Alpha /数据” – Ioannis 2010-04-28 16:39:34