为什么这个函数什么都没有返回,虽然有匹配?

时间:2014-03-05 00:38:47

标签: c# algorithm recursion foreach compact-framework

我称之为(Compact Framework - 此代码在Windows CE手持设备上运行)方法:

public static List<string> GetXMLFiles(string fileType, string startingDir)
{
    const string EXTENSION = ".XML";
    string dirName = startingDir; 
    var fileNames = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(dirName))
        {
            string ext = Path.GetExtension(f).ToUpper();
            string fileNameOnly = Path.GetFileNameWithoutExtension(f);
            if ((ext.Equals(EXTENSION, StringComparison.OrdinalIgnoreCase)) && (fileNameOnly.Contains(fileType)))
            {
                fileNames.Add(f);
            }
        }
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(fileType, d);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return fileNames;
}

......就像这样:

List<String> XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\");
MessageBox.Show(XMLFiles.Count.ToString());

...但它没有返回任何内容(MessageBox显示&#34; 0&#34;),即使文件与fileType匹配且扩展名为.xml。

是因为我的GetXMLFiles()方法出了问题吗?根据一只猫here,我的方法被搞砸了,我应该更频繁地添加到字符串(fileNames)的通用列表中。

如果他是对的,我不会那样做,因为在我看来这就是方法应该如何运作:

(a) The first foreach loop looks at files below the root; if a match is found, it's added to the generic list of string
(b) The second foreach loop makes a recursive call to its method, once for every subdirectory on the device; step "a" occurs again for that directory, adding any matches to the generic list of string.

通过这种方式,搜索所有目录,找到的任何匹配项都会添加到字符串(fileNames)的通用列表中。

在第二个foreach循环运行其路线/处理所有目录后,控制权将下降到最后一行代码,这会将fileNames返回给调用者。

所以,根据我的意见,我应该把比赛归还,但我什么都没得到。

如果我错了并且Alan是对的,我应该在哪里添加额外的调用来添加/如何重新设计此方法?

更新

这样称呼:

List<String> XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\");

......不起作用,但这样做:

List<String> XMLFiles = CCRUtils.GetXMLFiles(fileType, @"\");

1 个答案:

答案 0 :(得分:3)

在递归中,您丢失了在子目录中找到的文件。以这种方式捕获返回文件名:

foreach (string d in Directory.GetDirectories(dirName))
{
    fileNames.AddRange(GetXMLFiles(fileType, d));
}

该行var fileNames = new List<String>();创建了一个名为fileNames的局部变量。您可能会认为因为您的方法是静态的,方法内的变量是静态的。不是这种情况。因此,每次调用GetXMLFiles时,都会为每个调用创建此变量的副本。

由于fileNames对于GetXMLFiles的每次调用都是本地的,因此您需要将它找到的所有文件名返回给调用者,并且调用者需要将这些添加到本地的集合中。< / p>