【问题标题】:Counter inside a recursive function递归函数内的计数器
【发布时间】:2013-11-11 18:41:36
【问题描述】:

我需要计算这个递归函数中删除的文件数。由于它是递归的,我不能使用 if 语句,而且 C# 不支持全局变量。有其他选择吗?

static void DirSearch(string path)
{
    try
    {
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);
                    //count++
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            DirSearch(dirPath);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

【问题讨论】:

  • 当然 C# 支持全局变量。你从哪里得到它没有的想法?!另外,有没有想过传入一个额外的参数来保持删除文件的数量?为您的计数器方法添加一个额外的参数。
  • @Ahmedilyas 从技术上讲,他们并非都是某种类型的成员。
  • 顺便说一句,我会重命名该函数。搜索意味着它将遍历数据源并返回有关它的信息,但该函数正在删除所有 desktop.txt 文件。可能还值得为文件名添加一个参数,而不是将其硬编码到 desktop.txt。
  • @DanLyons:同意!这段代码只是为了说明问题

标签: c# recursion counter delete-file


【解决方案1】:

一种方法是传入一些东西让它算进去。我会使用ref 来执行此操作,例如:

static void DirSearch(string path, ref int count)
{
    try
    {
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);
                    count++
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            DirSearch(dirPath,ref count);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

然后调用它:

int count = 0;

DirSearch(@"C:\SomePath",ref count);

然后您可以像在代码中注释掉的那样正常使用count

【讨论】:

  • 需要将 ref count 作为参数传递给对 DirSearch 的递归调用
  • 为什么ref可以返回受影响的目录数量?
  • +1。返回已处理文件的数量将比ref 干净得多。
  • 你是对的,你也可以像@wdosanjos 回答一样返回,完全取决于你喜欢什么,我也赞成他的回答。
【解决方案2】:

尝试递归count,如下所示。所以DirSearch 返回已删除文件的count

static int DirSearch(string path)
{
    int count = 0;

    try
    {
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);

                    count++;
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            count += DirSearch(dirPath);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }

    return count;
}

【讨论】:

    【解决方案3】:

    没有 ref 变量(所以你不需要传递正确初始化的东西):

    static int DirSearch(string path)
    {
        try
        {
            int count = 0;
            foreach (string dirPath in Directory.GetDirectories(path))
            {
                foreach (string filePath in Directory.GetFiles(dirPath))
                {
                    string filename = Path.GetFileName(filePath);
                    if (filename.Equals("desktop.txt"))
                    {
                        File.Delete(filePath);
                        count++;
                    }
                    Console.WriteLine(filePath); // print files
                }
                Console.WriteLine(dirPath); // print directories
                count += DirSearch(dirPath);
            }
            return count;
        }
        catch (System.Exception excpt)
        {
            Console.WriteLine(excpt.Message);
        }
    }
    

    【讨论】:

      【解决方案4】:

      您是否也考虑过这里介绍的非递归解决方案? https://stackoverflow.com/a/929418/2979680

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 2014-06-08
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 1970-01-01
        相关资源
        最近更新 更多