2010-01-03 4 views

ответ

21

В других сказали, в .NET 3.5 и более ранних версиях не было способа сделать это аккуратно - вам либо нужно написать свой собственный метод Combine, либо позвонить по телефону Path.Combine несколько раз.

Но радоваться - ибо в .NET 4.0, есть this overload:

public static string Combine(
    params string[] paths 
) 

Там также перегрузок с 3 или 4 строки, по-видимому, так что ему не нужно, чтобы создать массив без необходимости для общих случаев ,

Надеюсь, Mono скоро перенесет эти перегрузки - я уверен, что их было бы легко реализовать и высоко оценить.

+0

Нельзя ли объявить единый массив более эффективным, объявив 4 разных переменных? Что может быть причиной перегрузки в 4 или 3 строки? –

+1

@ Хасан: Нет, для создания массива требуется отдельный объект, который позже должен быть собран с помощью мусора и т. Д. Передача двух отдельных переменных более эффективна, чем создание нового массива, содержащего две ссылки. –

+5

Не нужно ждать, это реализовано с 10/21/09 :) http://anonsvn.mono-project.com/viewvc?view=revision&revision=144597 –

4

Нет. Вы должны позвонить Path.Combine() несколько раз.

Вы можете написать вспомогательный метод, который делает это для вас, хотя:

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 - Идеально подходит, потому что вы не добавили ни одного лишнего LINQ. – ChaosPandion

+1

Взглянув на логику, вы можете легко избавиться от этой второй инструкции if. – ChaosPandion

+1

@ChaosPandion: Если вы собираетесь избегать Linq, тогда вы также должны оптимизировать алгоритм Schlemiel-the-painter и вместо этого использовать Path.PathSeparator и другие статические поля с помощью 'StringBuilder'. Я решил, что выступление здесь не проблема. – Aaronaught

4

Не простой, но умный :)

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

Или:

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

Это удобно, если вы не делаете это более одного раза. Вы можете упростить его, но: 'new [] {" aaa "," bbb "," ccc "} .Aggregate (Path.Combine);' (предполагая, что вы используете System.IO; '). –

30

Вот полезный метод вы можете использовать:

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

Альтернативный код-гольф версия (короче, но не совсем ясно, семантика немного отличается от Path.Combine):

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

Тогда вы можете назвать это как:

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

@Downvoter: Давайте послушаем. – Aaronaught

+0

Это может быть глупый вопрос, но откуда возникает Агрегат? Я использую Mono для Mono/.Net 3.5, и компилятор не может его найти. –

+1

'using System.Linq'. – SLaks

0

С помощью метода перегрузки введен в .NET 4 Path.Combine(string [])

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