Есть ли простой способ объединить два относительных пути в C #? - PullRequest
3 голосов
/ 28 апреля 2010

Я хочу объединить два относительных пути в C #.

Например:

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

Я хочу вернуть

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

Я могу реализовать это, разбив второй массив и сравнив его в цикле for, но мне было интересно, есть ли что-то похожее на Path.Combine или это можно сделать с помощью регулярных выражений или Linq?

Спасибо

Ответы [ 4 ]

4 голосов
/ 28 апреля 2010

При условии, что две строки всегда имеют тот же формат, что и в вашем примере, это должно работать:

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".


Обратите внимание, что этот алгоритм по существу создает все возможные комбинации двух путей и не особенно эффективен.

4 голосов
/ 28 апреля 2010

Я думаю, что это требует априорных знаний о том, что некоторые папки одинаковы, что вы не можете безопасно определить из простого пути (учитывая, что он не абсолютен).

Вы должны написать собственную логику для объединения этих путей.

1 голос
/ 28 апреля 2010

Попробуйте это ...

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

result = p1.Union(p1);

Он использует System.Linq и может быть легко упакован в метод расширения.

Конечно, он предполагает что-то о значениях path1 и path2.

0 голосов
/ 28 апреля 2010

Path.GetFullPath (Path.Combine (path1, path2))

GetFullPath объединит и упростит полученный путь.

РЕДАКТИРОВАТЬ: Неважно, это работает только для абсолютных путей ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...