0

私の質問「現代の言語はローカル変数と再帰をどのように処理しますか?」ファイル検索メソッドを書くことから来ています。基本的、

public ArrayList getMusicFiles(string directory){
    ArrayList songpaths = new ArrayList();

    string[] localFiles = System.IO.Directory.GetFiles(directory);
    for(int i=0; i<localFiles.Length-1; i++)
        if(isMusicFile(localFiles[i]))
            songpaths.add(localFiles[i]);

    string[] localFolders = System.IO.Directory.GetDirectories(directory);
    for(int i=0; i<localFolder.length-1; i++)
        getMusicFiles(localFolder[i]);
}

したがって、問題は、再帰ごとに「ソングパス」を再宣言することです。VB では、songpath を static として宣言できます。これで解決すると思います。ArrayList を上書きしないようにする良い C# の方法はありますか?

4

5 に答える 5

2

アキュムレータ戦略を使用することを選択し、配列を渡す必要があるヘルパー関数に作業を押し付けることができます。

public List<string> GetMusicFiles(string directory)
{
    List<string> songPaths = new List<string>();

    GetMusicFilesHelper(directory, songPaths);

    return songPaths;
}

private void GetMusicFilesHelper(string directory, List<string> paths)
{
    string[] localFiles = Directory.GetFiles(directory);
    for(int i = 0; i < localFiles.Length; i++) 
    {
        if(isMusicFile(localFiles[i])) paths.Add(localFiles[i]);
    }

    string[] localFolders = Directory.GetDirectories(directory);
    for(int i = 0; i < localFolder.length; i++)
    {
        GetMusicFilesHelper(localFolder[i], paths);
    }
}

別のオプションは、再帰をすべてスキップして、作業を任せるDirectory.GetFilesことです。

public List<string> GetMusicFiles(string directory)
{
    List<string> songPaths = new List<string>();

    // TODO: pick a better search pattern
    string[] paths = Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories);
    foreach (string path in paths)
    {
        if (IsMusicFile(path))
        {
            songPaths.Add(path);
        }
    }
}

.Net 4.0+ を使用している場合、これは次のようなケーキウォークになりますDirectory.EnumerateFiles

public IEnumerable<string> GetMusicFiles(string directory)
{
    return Directory.EnumerateFiles(directory, "*.*", SearchOption.AllDirectories)
                    .Where(ff => IsMusicFile(ff));
}
于 2013-05-07T22:34:46.983 に答える
1

コードは少し読みにくいですが、とにかく... 再帰に実際に使用されるメソッドのプライベート バージョンを作成し、ArrayList をパラメーターとして渡すことをお勧めします。

于 2013-05-07T22:31:17.010 に答える
0

現在のリストを渡すことでそれを行うことができます-そうすれば、再帰にリストを追加できます。このようなもの...

public ArrayList getMusicFiles(string directory, ArrayList data, string rootDir) {
    string[] localFiles = System.IO.Directory.GetFiles(rootDir);
    for (int i = 0; i < localFiles.Length - 1; i++) 
        if (isMusicFile(localFiles[i])) 
            songpaths.add(localFiles[i]);

    string[] localFolders = System.IO.Directory.GetDirectories(rootDir);
    for (int i = 0; i < localFolder.length - 1; i++) 
        data.AddRange(getMusicFiles(localFolder[i]));
    return data;
}
于 2013-05-07T22:34:33.040 に答える
-1
public ArrayList getMusicFiles(string directory, ArrayList songpaths){
  string[] localFiles= System.Io.Directory.GetFiles(rootDir);

  for(int i=0; i<localFiles.Length-1; i++) if(isMusicFile(localFiles[i]))
      songpaths.add(localFiles[i]);

  string[] localFolders= System.IO.Directory.GetDirectories(rootDir);
for(int i=0; i<localFolder.length-1; i++) getMusicFiles(localFolder[i]);

そしてnew ArrayList()、メソッドを最初に呼び出すときに a を渡します。

于 2013-05-07T22:30:50.953 に答える