2009-04-17 6 views
20

문자열 배열을 사용할 수있는 오버로드가 없다는 것에 놀랐습니다. 어쨌든, Path.Combine 호출을 중첩하지 않도록하는 가장 좋은 방법은 무엇입니까?Path.Combine을 두 개 이상의 인수와 함께 사용할 수 있습니까?

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

는 4 개의 새로운 문자열 단지 1

+5

당신을 허용 할 방법에 대해 설명합니다. Combine()이 Path.Combine (path1, path2, path3, ...)과 같이 두 개 이상의 문자열을 가져 오도록 변경되었습니다. 단! – fredw

+1

글쎄, 쓰레기. 마이크로 소프트는 NET 2.0이나 3.5에서라도 구현할 상식이 없었습니까? – david

답변

21

일의 효율성 측면이 문제가 IMO되지 않습니다 얻기 위해 생성되는 결과 때문에 비효율적 것 - 그것은 사물의 유용성 측면입니다.

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

당신은 방금 Path.Combine("foo", "bar") 쓰기하지만 확실히 코드를 만들기 위해 도움이 될 경우 기존의 두 매개 변수 버전과 충돌하는 것을 방지하기 위해 최소한 세 가지가 필요합니다 : 개인적으로 나는 거기가 과부하이되어야한다고 생각 명확 해. 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이있는 경우 한 줄에이 작업을 수행 할 수 있습니다.

// 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에 대해 몰랐다. –

+0

@Christian. 집계는 손에 넣을 수있는 매우 강력한 도구입니다. –

관련 문제