2010-01-03 13 views

Antwort

21

Wie andere habe gesagt, in .NET 3.5 und früheren Versionen gab es keine Möglichkeit, dies ordentlich zu tun - Sie müssen entweder Ihre eigene Combine Methode schreiben oder Path.Combine mehrere Male anrufen.

Aber freuen - für in .NET 4.0, gibt es this overload:

public static string Combine(
    params string[] paths 
) 

Es gibt auch Überlastungen unter 3 oder 4 Saiten, vermutlich so, dass es braucht nicht einen Array unnötig für allgemeine Fälle zu schaffen .

Hoffentlich Mono wird diese Überlastungen bald portieren - ich bin mir sicher, dass sie einfach zu implementieren und sehr geschätzt werden.

+0

Sollte es nicht effizienter sein, einzelne Arrays zu deklarieren, dann deklarieren Sie 4 verschiedene Variablen? Was könnte der Grund für eine Überlastung von 4 oder 3 Strängen sein? –

+1

@Hasan: Nein, das Erstellen eines Arrays erfordert ein separates Objekt, das später mit dem Garbage Collection-Vorgang abgeglichen werden muss. Das Übergeben von zwei separaten Variablen ist effizienter als das Erstellen eines neuen Arrays mit zwei Referenzen. –

+5

Keine Notwendigkeit zu warten, es ist seit 21.10.09 implementiert :) http://anonsvn.mono-project.com/viewvc?view=revision&revision=144597 –

4

Nein - Sie müssen Path.Combine() mehrmals anrufen.

Sie könnten eine Hilfsmethode schreiben, die es für Sie tut, aber:

public static string CombinePaths(params string[] paths) { 
    if (paths == null) { 
     return null; 
    } 
    string currentPath = paths[0]; 
    for (int i = 1; i < paths.Length; i++) { 
     currentPath = Path.Combine(currentPath, paths[i]); 
    } 
    return currentPath; 
} 
+1

+1 - Perfekt, weil Sie keine unnötige LINQ hinzugefügt. – ChaosPandion

+1

Mit einem Blick auf die Logik können Sie diese zweite if-Anweisung leicht loswerden. – ChaosPandion

+1

@ChaosPandion: Wenn Sie Linq vermeiden möchten, sollten Sie auch den Algorithmus von Schlemiel-the-painter optimieren und stattdessen Path.PathSeparator und andere statische Felder mit einem 'StringBuilder' verwenden. Ich dachte, Leistung war hier kein Thema. – Aaronaught

4

Nicht einfach, aber clever :)

string str1 = "aaa", str2 = "bbb", str3 = "ccc"; 
string comb = new string[] { str1, str2, str3 } 
    .Aggregate((x, y) => System.IO.Path.Combine(x, y)); 

Oder:

string CombinePaths(params string[] paths) 
{ 
    return paths.Aggregate((x,y) => System.IO.Path.Combine(x, y)); 
} 
+1

Dies ist praktisch, wenn Sie es nicht mehr als einmal tun. Sie können es jedoch sehr vereinfachen: 'new [] {" aaa "," bbb "," ccc "} .Aggregat (Path.Combine);' (vorausgesetzt, Sie verwenden 'System.IO;'). –

30

Hier ist ein Hilfsmethode, die Sie verwenden können:

public static string CombinePaths(string path1, params string[] paths) 
{ 
    if (path1 == null) 
    { 
     throw new ArgumentNullException("path1"); 
    } 
    if (paths == null) 
    { 
     throw new ArgumentNullException("paths"); 
    } 
    return paths.Aggregate(path1, (acc, p) => Path.Combine(acc, p)); 
} 

Alternative Code-Golf-Version (kürzer, aber nicht ganz so klar sind Semantik ein bisschen anders aus Path.Combine):

public static string CombinePaths(params string[] paths) 
{ 
    if (paths == null) 
    { 
     throw new ArgumentNullException("paths"); 
    } 
    return paths.Aggregate(Path.Combine); 
} 

Dann Sie dies als anrufen:

string path = CombinePaths(path1, path2, path3); 
+0

@Downvoter: Lass es uns hören. – Aaronaught

+0

Das ist vielleicht eine blöde Frage, aber woher kommt das Aggregat? Ich verwende Mono-Targeting für Mono/.Net 3.5 und der Compiler kann es nicht finden. –

+1

'using System.Linq'. – SLaks

0

Mit dem -Methodenüberladung in .NET eingeführt 4 Path.Combine(string [])

Path.Combine(new [] { "abc", "def", "ghi", "jkl", "mno" }); 
Verwandte Themen