0

我有这个方法,它传递了一个文件数组。然后它将任何替换/\\. 然后我调用一个方法并将数组传递给它,它将参数放入一个数组,格式化它并返回新数组。接下来,我再次调用相同的方法,将相同的本地数组传递给它,以不同的格式对其进行格式化,并将out两个数组都传递给它。问题是,第二个方法调用保留了第一个方法调用的格式。

    public void Verify(string[] svnFiles, out string[] local, out string[] build)
    {            
        //replace / with double \\
        var transformed = TransformToFolders(svnFiles);

        build = GetFiles(_buildPath, transformed);
        local = GetFiles(_localPath, transformed);
    }

    private static string[] GetFiles(string path, params string[] files)
    {
        var moddedFiles = files;
        for (var i = 0; i < files.Count(); i++)
            moddedFiles[i] = string.Format(@"{0}\{1}", path, moddedFiles[i]);

        return moddedFiles;
    }

因此,当我调用时local = GetFiles(_localPath, transformed); transformed具有与moddedFiles. GetFiles用于files直接操作它的参数并且我得到了相同的行为,所以这就是我尝试创建一个新数组的原因,但moddedFiles似乎仍然只是一个引用而不是实际副本。有没有一种简单的方法来制作它的实际副本,这样我基本上就不会了_localPath\_buildPath\moddedFile

4

1 回答 1

4

听起来你想要:

var moddedFiles = (string[]) files.Clone();

这将创建数组的浅拷贝,这在很大程度上等同于字符串的深拷贝,因为它们是不可变的。

但是,更清洁(IMO)的替代方法是使用 LINQ:

private static string[] GetFiles(string path, params string[] files)
{
    return files.Select(file => string.Format(@"{0}\{1}", path, file))
                .ToArray();
}

或者,如果您真的想保留原来的粗略方法,则不需要真正克隆数组 - 只需创建一个大小合适的新数组即可。

private static string[] GetFiles(string path, params string[] files)
{
    var moddedFiles = new string[files.Length];
    for (var i = 0; i < files.Length; i++)
    {
        moddedFiles[i] = string.Format(@"{0}\{1}", path, files[i]);
    }
    return moddedFiles;
}
于 2013-11-14T16:28:59.420 回答