为什么if语句在foreach循环之前执行?

时间:2016-09-27 17:21:44

标签: c#

我以前遇到过问题,现在我解决了,我无法解决这个问题。

调试图片

由于某种原因,if语句在foreach循环之前被调用,因此,我想在循环之后发送的变量是空的。我该如何解决?我认为代码总是从上到下阅读?

最后,列表包含它应该包含的所有内容但if语句不是第二次调用...

        public static void GetAllFiles(string sDir)
    {
        List < string > datas = new List<string>();
        foreach (string dir in Directory.GetDirectories(sDir))
        {
            try
            {
                foreach (string file in Directory.GetFiles(dir, "*text.txt"))
                {
                    string var = File.ReadAllText(file);
                    datas.Add(var);
                }
                GetAllFiles(dir);
            }
            catch
            {
            }
        }
        if (datas != null)
        {
            string dets = String.Join("\n\n", datas.ToArray());
            sendmm(dets);
        }
    }

正在传递appdata目录

2 个答案:

答案 0 :(得分:1)

您的方法datasforeach循环内调用自己,并且您正在重置方法开头的列表,这就是为什么您看到空GetAllFiles的原因Directory.GetDirectories(sDir)块之后的列表。

您在调试图片中的位置是在第二个(甚至更深)Call Stack调用内,GetAllFiles调用不再返回任何目录。你已经在一个没有更多目录的子目录中了。

要更好地了解发生的情况,请打开IDE中的datas窗口,然后单击上/下堆栈。您应该在堆栈中看到至少两个<div class="slides"> <div class="slide active" id="one"></div> <div class="slide" id="two"></div> <div class="slide" id="third"></div> <div class="slide" id="fourth"></div> </div> <button onclick="slide-down()"> Next slide </button> <button onclick="slide-up()"> Previous slide </button> 个条目。单击它们并检查您的QFileDialog列表和其他本地变量。

答案 1 :(得分:0)

最简单的方法是:

public static void GetAllFiles(string sDir)
{
  Console.WriteLine(String.Join("\n\n",Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories)));
}

不需要递归 - 但由于你在问题中使用了递归,你可能会简化,如果你需要递归用于其他目的,这就是你如何使用它。

List < string > datas = new List<string>();

public static void GetAllFiles(string sDir)
{     datas = new List<string>();
      datas.AddRange(Directory.GetFiles(sDir);
    foreach (string dir in Directory.GetDirectories(sDir))
    {
       recursiveSearch();           
    }
    if (datas != null)
    {
        string dets = String.Join("\n\n", datas.ToArray());
        sendmm(dets);
    }
}
private string recursiveSearch(string dir)
{
   datas.AddRange(Directory.GetFiles(dir));
   foreach(string directory in dir.GetDirectories())
   {
       recursiveSearch(directory);
   }
}