具有yield return的C#调试和延迟执行

时间:2017-02-06 12:32:33

标签: c#

我有以下代码,我想一次返回一个FileInfo对象,但是我收到了显示的错误消息:

public static FileInfo GetTextFile(string path, string pattern, SearchOption searchoption)
    {

        DirectoryInfo dirs = new DirectoryInfo(path);

        var files = dirs.EnumerateFiles(pattern, searchoption);//Getfiles is eager

        foreach (var file in files)
        {
             return file;
        }


    }
  

' FileEnumarater.GetTextFile(string,string,SearchOption)':并非所有代码路径都返回值

我在网上进行了一些调查,发现我需要使用"收益率"为了这个工作,所以我将代码更改为此,错误消失了:

 public static IEnumerable<FileInfo> GetTextFile(string path, string pattern, SearchOption searchoption)
    {

        DirectoryInfo dirs = new DirectoryInfo(path);

        var files = dirs.EnumerateFiles(pattern, searchoption);//Getfiles is eager

        foreach (var file in files)
        {
            yield return file;
        }


    }

然而,当我调试我希望一次一行地执行此代码,但这不会发生。从下面的调用代码中,调试器不会进入静态类,而是直接突出显示的代码。

为了实现这一目标,还需要改变什么呢?我读到我需要通过添加.ToList()强制执行代码,我在第一个屏幕截图中执行了这个操作,但它没有帮助。

也许我把它放在了错误的地方?

这是我的调用代码,它只是控制台应用程序中的主要方法。调试器跨越高亮度线:

static void Main(string[] args)
    {
        string path = @"G:\General\";
        var x = FileEnumarater.GetTextFile(path, "cmb*.txt", SearchOption.AllDirectories);//add ToList to force evaluation
    }

2 个答案:

答案 0 :(得分:1)

您需要迭代从GetTextFile返回的序列。您可以使用ToList来强制迭代,但是您需要在返回的序列上使用它,而不是从DirectoryInfo.GetFiles返回的序列,即

var x = FileEnumerator.GetTextFile(path, "*list.txt", SearchOption.AllDirectories).ToList();

如果要从自己的代码中逐步执行控制流,可以使用foreach手动迭代结果序列:

foreach(FileInfo fi in FileEnumerator.GetTextFile(path, "*list.txt", SearchOption.AllDirectories)) 
{
    //process result
}

请注意,DirectoryInfo.GetFiles已经返回IEnumerable<FileInfo>,因此您可以直接返回它,而不是将其转换为延迟序列:

DirectoryInfo dirs = new DirectoryInfo(path);
return dirs.GetFiles(pattern, searchOption);

如果您希望懒散地检索结果,则应使用DirectoryInfo.EnumerateFiles代替GetFiles,这是急切的:

return dirs.EnumerateFiles(pattern, searchOption);

答案 1 :(得分:0)

您的代码没有所有代码路径的返回值,因为在文件是空数组的情况下,永远不会到达foreach循环内的return语句。当文件是空数组时,您应该处理这种情况。顺便说一下,你的代码总是返回&#34;文件中的第一项&#34;阵列。这是你的意图吗?