2009-04-17 13 views
20

文字列配列をとることができるオーバーロードがないことに驚いています。とにかく、Path.Combineへの呼び出しのネストを避ける最善の方法は何ですか?Path.Combineは3つ以上の引数でどのように使用できますか?

pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4))) 

それは4つの新しい文字列が物事の1

+5

あなたを許すだろうか。 Combine()は、Path.Combine(path1、path2、path3、...)のように2つ以上の文字列を取るように変更されました。甘い! – fredw

+1

さて、やっぱり。マイクロソフトではNET 2.0や3.5でもそれを実装する常識は持っていませんでしたか? – david

答えて

21

効率側を取得するために作成され、その結果から、これは非効率ですIMOの問題ではない - それは物事のユーザビリティ側です。あなたはあなただけPath.Combine("foo", "bar")を書く場合は、既存の2パラメータバージョンと衝突するのを防止するために、少なくとも3を持っている必要がありますが、それは確かにコードを作るために役立つだろう

Combine(string first, string second, string third, params string[] others) 

:個人的に私はの過負荷があるようにあるべきだと思います明らかに。 Connectで機能リクエストを開いてみませんか?

もちろん

、あなたはこの自分自身を実装することができます(および他のクラスにパラメータの数はあまり関係ありません):

public static string CombinePaths(string first, params string[] others) 
{ 
    // Put error checking in here :) 
    string path = first; 
    foreach (string section in others) 
    { 
     path = Path.Combine(path, section); 
    } 
    return path; 
} 
+5

Downvoters:理由を挙げてください。さもなければ、あなたのdownvoteは無意味です。 –

+6

OPの希望が認められました。 Path.Combine(params)のサポートが.net 4 Beta2に追加されました - http://blogs.msdn.com/bclteam/archive/2009/10/21/what-s-new-in-the-bcl-in -net-4-beta-2-justin-van-patten.aspx – Gishu

+1

Resharperは、より簡潔なイベントを提案しています.Aggregate(最初、Path.Combine) – username

1

それはそれを自分で実装するのはかなり簡単です:

public string Combine(params string[] paths) 
{ 
    char[] pathSeparators = new char[] 
     { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar, Path.VolumeSeparatorChar }; 

    if(paths == null) throw new ArgumentNullException("paths"); 
    if(paths.Length == 1) return paths[0]; 

    StringBuilder pathBuilder = new StringBuilder(); 

    foreach(string path in paths) 
    { 
     if(Path.IsPathRooted(path)) 
      pathBuilder = new StringBuilder(path); 
     else 
     { 
      char last = pathBuilder.Length > 0 ? 
       pathBuilder[pathBuilder.Length - 1] : 
       path[path.Length - 1]; 

      if(Array.IndexOf(pathSeparators, last) == -1) 
       pathBuilder.Append(Path.DirectorySeparatorChar); 

      pathBuilder.Append(path); 
     } // else 
    } // foreach 

    return pathBuilder.ToString(); 
} 

[Test()] 
public void CombinePaths() 
{ 
    string result = Combine(@"C:\Program Files\", @"Microsoft.NET", @"ADOMD.NET\", "90", "msadomdx.dll"); 
    Assert.AreEqual(@"C:\Program Files\Microsoft.NET\ADOMD.NET\90\msadomdx.dll", result); 
} 
25

配列またはIEnumerableが既にある場合は、1行でこれを行うことができます。

// I'm assuming that you've got an array or IEnumerable<T> from somewhere 
var paths = new string[] { path1, path2, path3, path4, path5, path6 }; 

string result = paths.Aggregate(Path.Combine); 

ない場合、その後...文字列に

public static class PathExtension 
{ 
    public static string CombinePathWith(this string path1, string path2) 
    { 
     return Path.Combine(path1, path2); 
    } 
} 

を独自の拡張メソッドを書くことについて...それは...このような連鎖これらに.Net4パスに

string result = path1.CombinePathWith(path2) 
        .CombinePathWith(path3) 
        .CombinePathWith(path4) 
        .CombinePathWith(path5) 
        .CombinePathWith(path6); 
+3

クール、私はEnumerable.Aggregateについて知りませんでした! @Christian。 –

+0

Aggregateは手元にある非常に強力なツールです。 –

関連する問題