.net 如何将Path.Combine与两个以上的参数一起使用?
我很惊讶没有一个重载可以占用字符串数组。无论如何,避免对Path.Combine嵌套调用的最佳方法是什么.net 如何将Path.Combine与两个以上的参数一起使用?,.net,string,path,io,concatenation,.net,String,Path,Io,Concatenation,我很惊讶没有一个重载可以占用字符串数组。无论如何,避免对Path.Combine嵌套调用的最佳方法是什么 pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4))) 这似乎效率很低,因为它会导致创建四个新字符串来获得一个字符串。效率方面的问题在我看来不是问题,而是可用性方面的问题。就我个人而言,我认为应该有过多的: Combine(string first, string second, st
pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4)))
这似乎效率很低,因为它会导致创建四个新字符串来获得一个字符串。效率方面的问题在我看来不是问题,而是可用性方面的问题。就我个人而言,我认为应该有过多的:
Combine(string first, string second, string third, params string[] others)
如果您只编写Path.Combine(“foo”、“bar”)
,则至少需要三个参数,以防止它与现有的两参数版本冲突,但这肯定有助于使代码更清晰。为什么不在上打开功能请求
当然,您可以自己实现(在另一个类中,参数的数量并不重要):
自己实现它非常简单:
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);
。。。这样你就可以像这样把这些链起来
string result = path1.CombinePathWith(path2)
.CombinePathWith(path3)
.CombinePathWith(path4)
.CombinePathWith(path5)
.CombinePathWith(path6);
酷,我不知道可枚举。聚合@基督教的。聚合是一个非常强大的工具。OP的愿望已经实现了。在.net 4 Beta2中添加了对Path.Combine(params)的支持-Resharper建议事件更简洁-其他.Aggregate(首先,Path.Combine)如果在.net 4或更高版本中使用
Path.Combine(params)
遇到问题,请注意它最多只接受4个字符串。否则我更喜欢马丁的答案。@Vaindil:No,Path.Combine(params string[]values)
接受任意数量的参数,例如Path.Combine(“用户”、“Jon”、“测试”、“x”、“y”、“z”)
@JonSkeet:我不知道我怎么会在列表中漏掉。抱歉.In.Net4 Path.Combine()已更改为包含两个以上的字符串,如下所示:Path.Combine(路径1、路径2、路径3,…)。好极了!好吧,废话。微软没有常识在NET2.0甚至3.5中实现它?
public static class PathExtension
{
public static string CombinePathWith(this string path1, string path2)
{
return Path.Combine(path1, path2);
}
}
string result = path1.CombinePathWith(path2)
.CombinePathWith(path3)
.CombinePathWith(path4)
.CombinePathWith(path5)
.CombinePathWith(path6);