Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种简单的方法来组合C#中的两条相对路径?_C#_Regex_Path_Relative Path - Fatal编程技术网

有没有一种简单的方法来组合C#中的两条相对路径?

有没有一种简单的方法来组合C#中的两条相对路径?,c#,regex,path,relative-path,C#,Regex,Path,Relative Path,我想在C#中组合两个相对路径 例如: string path1 = "/System/Configuration/Panels/Alpha"; string path2 = "Panels/Alpha/Data"; 我想回去 string result = "/System/Configuration/Panels/Alpha/Data"; 我可以通过拆分第二个数组并在for循环中对其进行比较来实现这一点,但我想知道是否有类似于路径的内容。是否可以使用组合,或者是否可以使用正则表达式或Lin

我想在C#中组合两个相对路径

例如:

string path1 = "/System/Configuration/Panels/Alpha";
string path2 = "Panels/Alpha/Data";
我想回去

string result = "/System/Configuration/Panels/Alpha/Data";
我可以通过拆分第二个数组并在for循环中对其进行比较来实现这一点,但我想知道是否有类似于
路径的内容。是否可以使用
组合,或者是否可以使用正则表达式或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/c”
。您可以将LastOrDefault更改为FirstOrDefault以获得
“/System/a/b/a/b/c”


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

试试这个

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

result = p1.Union(p1);
它使用System.Linq,并且可以很容易地打包到扩展方法中

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

Path.GetFullPath(Path.Combine(路径1、路径2))

GetFullPath将合并并简化生成的路径。


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

路径有什么问题吗?Combine?@Kyle Alons:@loannis想要使用Combine方法识别路径的共享段并适当地“合并”它们。Path.Combine将返回“/System/Configuration/Panels/Alpha/Data/Panels/Alpha/Data”为什么要组合路径,它们代表什么?如果它们可以以多种方式结合在一起呢?如果将“/System/a/b/a/b/c”与“a/b/a/b/c”结合使用,会是“/System/a/b/a/b/c”还是“/System/a/b/a/b/c”?+1:如果没有已知的定位点,相同的名称不一定意味着层次结构中的同一文件夹。假设path1的部分值总是已知的(例如“/System/Configuration/…”,这是可能的。@loannis,但这需要您知道存在一定程度的重叠,并且您的文件夹结构不包括具有类似名称的其他路径。谢谢您,这是非常优雅的代码。我不想用于。:)注意事项是,您必须假设“Panels/Alpha”与您的文件夹相同“/System/Configuration/*Panels/Alpha*“我不认为这是优雅的,事实上,我认为它相当丑陋。我无意冒犯作者,但如果我被指派维护这个特定的应用程序,我更希望作者使用标准的、命令式的代码来编写它。然而,从学术意义上讲,这是一个很酷的代码。我认为这是一个优雅的代码,但我认为只有“命令式”的人才能使用它。虽然我的解决方案可能并不完美,但在更多的情况下,这是失败的。例如,如果
path1=“/System/Panels/Configuration/Panels/Alpha”
path2=“Panels/Alpha/Data”
,结果是
“/System/Panels/Configuration/Alpha/Data”
。同意。。。虽然确实如此,但如果没有额外的上下文,就不可能提供“最适合”的解决方案。