2010-04-28 78 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將合併並簡化得到的路徑。

編輯:沒關係,只適用於絕對路徑...

相關問題