我经常在F#中使用此递归“访问者”

let rec visitor dir filter=
    seq { yield! Directory.GetFiles(dir, filter)
          for subdir in Directory.GetDirectories(dir) do yield! visitor subdir filter}

最近,我开始着手在C#中实现某些F#功能,并且尝试将其重现为IEnumerable,但是我很难做到这一点:
static IEnumerable<string> Visitor(string root, string filter)
{
    foreach (var file in Directory.GetFiles(root, filter))
        yield return file;
    foreach (var subdir in Directory.GetDirectories(root))
        foreach (var file in Visitor(subdir, filter))
            yield return file;
}

我不明白的是为什么我必须在C#版本中进行两次foreach递归,而在F#中却没有。...seq {}是否隐式地执行“concat”操作?

最佳答案

yield!执行“展平”操作,因此它将您传递给它的序列集成到外部序列中,对序列中的每个元素隐式执行foreach,并对每个序列隐式执行yield

关于c# - 用C#编写F#递归文件夹访问者-seq vs IEnumerable,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/308481/

10-17 02:46