2010-01-03 21 views

Respuesta

21

Como otros he dicho, en .NET 3.5 y versiones anteriores, no ha habido una manera de hacer esto de forma ordenada, ya sea que tenga que escribir su propio método Combine o llamar al Path.Combine varias veces.

Alégrense - en .NET 4.0, hay this overload:

public static string Combine(
    params string[] paths 
) 

También hay sobrecargas tomar 3 o 4 cadenas, presumiblemente para que no se necesita para crear una matriz innecesariamente para los casos comunes .

Afortunadamente, Mono cargará esas sobrecargas pronto - estoy seguro de que serían fáciles de implementar y muy apreciadas.

+0

¿No debería declararse que una sola matriz es más eficiente que declarar 4 variables diferentes? ¿Cuál podría ser el motivo de la sobrecarga de 4 o 3 cuerdas? –

+1

@Hasan: No, la creación de una matriz requiere un objeto separado que se debe recolectar después, etc. Pasar dos variables separadas es más eficiente que crear una nueva matriz que contenga dos referencias. –

+5

No es necesario esperar, está implementado desde el 21/10/09 :) http://anonsvn.mono-project.com/viewvc?view=revision&revision=144597 –

4

No, tiene que llamar al Path.Combine() varias veces.

Se puede escribir un método de ayuda que lo hace por usted, sin embargo:

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 - Perfecto, ya que no se añaden LINQ innecesaria. – ChaosPandion

+1

Echando un vistazo a la lógica, puede deshacerse fácilmente de esa segunda instrucción if. – ChaosPandion

+1

@ ChaosPandion: si va a evitar Linq, también debe optimizar el algoritmo de Schlemiel-the-pintor y en su lugar utilizar Path.PathSeparator y otros campos estáticos con un 'StringBuilder'. Pensé que el rendimiento no era un problema aquí. – Aaronaught

4

No es sencillo, pero inteligente :)

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

O:

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

Esto es útil si no lo hace más de una vez. Sin embargo, puedes simplificarlo mucho: 'new [] {" aaa "," bbb "," ccc "} .Agregar (Path.Combine);' (suponiendo que estés 'usando System.IO;'). –

30

He aquí una método de utilidad que puede usar:

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)); 
} 

versión alternativa de código de golf (más corto, pero no es tan clara, la semántica es un poco diferente de Path.Combine):

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

A continuación, se puede llamar a esto como:

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

@Downvoter: Escuchemos. – Aaronaught

+0

Esta podría ser una pregunta estúpida, pero ¿de dónde viene Aggregate? Estoy utilizando la orientación Mono Mono/.Net 3.5, y el compilador no puede encontrarlo. –

+1

'using System.Linq'. – SLaks

0

Con el método introducido en la sobrecarga de .NET 4 Path.Combine(string [])

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