.net 如何将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

我很惊讶没有一个重载可以占用字符串数组。无论如何,避免对Path.Combine嵌套调用的最佳方法是什么

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