0

ファイルの配列が渡されるこのメソッドがあります。/次に、 anyをに置き換えます\\次に、メソッドを呼び出して配列を渡します。これにより、引数が新しい配列に入れられ、それがフォーマットされて、新しい配列が返されます。次に、同じメソッドを再度呼び出し、同じローカル配列を渡し、異なる形式で、out両方の配列を渡します。問題は、2 番目のメソッド呼び出しが最初のメソッド呼び出しの形式を保持していることです。

    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操作するために使用され、同じ動作を得ていたので、新しい配列を作成しようとしましたが、実際のコピーではなく参照に過ぎないようです。それの実際のコピーを作成する簡単な方法はありますか?filesmoddedFiles_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 に答える