문자열 배열을 사용할 수있는 오버로드가 없다는 것에 놀랐습니다. 어쨌든, Path.Combine 호출을 중첩하지 않도록하는 가장 좋은 방법은 무엇입니까?Path.Combine을 두 개 이상의 인수와 함께 사용할 수 있습니까?
pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4)))
는 4 개의 새로운 문자열 단지 1
문자열 배열을 사용할 수있는 오버로드가 없다는 것에 놀랐습니다. 어쨌든, Path.Combine 호출을 중첩하지 않도록하는 가장 좋은 방법은 무엇입니까?Path.Combine을 두 개 이상의 인수와 함께 사용할 수 있습니까?
pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4)))
는 4 개의 새로운 문자열 단지 1
일의 효율성 측면이 문제가 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;
}
Downvoters : 이유를 줘, 그렇지 않으면 downvote 무의미합니다. –
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
Resharper가 이벤트를보다 간결하게 제안합니다 .Aggregate (첫 번째, Path.Combine) – username
그것은 스스로를 구현하는 매우 간단합니다 :
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);
}
이미 배열 또는 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);
쿨, 나는 Enumerable에 대해 몰랐다. –
@Christian. 집계는 손에 넣을 수있는 매우 강력한 도구입니다. –
당신을 허용 할 방법에 대해 설명합니다. Combine()이 Path.Combine (path1, path2, path3, ...)과 같이 두 개 이상의 문자열을 가져 오도록 변경되었습니다. 단! – fredw
글쎄, 쓰레기. 마이크로 소프트는 NET 2.0이나 3.5에서라도 구현할 상식이 없었습니까? – david