Path.Combine 如何与两个以上的参数一起使用?

Posted

技术标签:

【中文标题】Path.Combine 如何与两个以上的参数一起使用?【英文标题】:How can Path.Combine be used with more than two arguments? 【发布时间】:2010-10-20 02:58:49 【问题描述】:

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

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

这似乎效率低下,因为它导致创建四个新字符串只是为了得到一个。

【问题讨论】:

在 .Net4 中,Path.Combine() 被更改为采用两个以上的字符串,如下所示:Path.Combine(path1, path2, path3, ...)。甜! 好吧,废话。 Microsoft 没有常识在 NET 2.0 甚至 3.5 中实现它? 【参考方案1】:

如果您已经有一个数组或 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);
    

...这将允许您像这样链接这些...

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

【讨论】:

酷,我不知道 Enumerable.Aggregate! @Christian。聚合是一个非常强大的工具。【参考方案2】:

事情的效率方面不是 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;

【讨论】:

OP 的愿望已经实现。 .net 4 Beta2 中添加了对 Path.Combine(params) 的支持 - blogs.msdn.com/bclteam/archive/2009/10/21/… Resharper 建议事件更简洁 others.Aggregate(first, Path.Combine) 如果您在 .NET 4 或更高版本中遇到 Path.Combine(params) 问题,请注意它最多只能接受 4 个字符串。否则我更喜欢马丁的回答。 @Vaindil:不,Path.Combine(params string[] values) 接受任意数量的参数,例如Path.Combine("Users", "Jon", "Test", "x", "y", "z") @JonSkeet:我不知道我是怎么错过列表中的that overload 的。我很抱歉。【参考方案3】:

自己实现非常简单:

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

【讨论】:

以上是关于Path.Combine 如何与两个以上的参数一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(stri

Path.Combine(string path1, string path2 )的用法

Path.Combine(string path1, string path2 )的用法

如何在 C# 中加入两条路径?

Path.Combine 和点符号

在 C# 中的 path.combine [重复]