我有这个传递文件数组的方法。然后,它会将/
替换为\\
。然后我调用一个方法并将数组传递给它,它将参数放入 new 数组,格式化它并返回新数组。接下来,我再次调用相同的方法,传递相同的本地数组,格式化不同,并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
?
答案 0 :(得分: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;
}