具有IAsyncEnumerable的深度优先递归

问题描述 投票:0回答:1

IEnumerable中涉及带有this 2010 SO Post的递归主题。我很好奇,随着.Net Core 3.X中IAsyncEnumerable<T>的出现,故事发生了怎样的变化?具体来说:

  1. [如乔恩·斯凯特(Jon Skeet)警告,我是否仍应担心为深树递归创建迭代器的资源成本?
  2. 在同一SO帖子中,有人提供了“通用非递归扩展方法”以实现深度优先迭代而无需递归。如果今天应该使用相同的方法,那么RecursiveSelect()IAsyncEnumerable<T>扩展名的更新版本是什么样的?

我的兴趣是对(远程)文件系统进行深度优先搜索,其中每次迭代都会导致一个远程文件在本地下载。为此,我打算创建一个异步“生成器”(长度未知的迭代器),可以使用await foreach进行迭代。

作为测试用例,我首先只是尝试对本地目录进行深度优先搜索...将找到的文件复制到其他任意文件夹中。

我想确保我正在有效地使用IAsyncEnumerable

注意:即使对于深树来说,创建大量的IAsyncEnumerable迭代器并不昂贵,但使用非递归方法仍然有意义,因为非递归方法可能能够“检查点”其进度并可以在某些原因导致应用程序崩溃时“恢复”。我不确定是否可以对递归方法进行同样的操作。

c# recursion .net-core generator .net-core-3.0
1个回答
1
投票

相同的考虑因素/解决方案应适用于IAsyncEnumerable,您可以在sharplab.io中进行检查-状态机和按方法调用创建的迭代器,以及用于异步处理的额外代码(与“简单” IEnumerable with yield return比较):

此方法:

public static async IAsyncEnumerable<int> AEn()
{
    for (int i = 1; i <= 10; i++)
    {
        await Task.Delay(1000);//Simulate waiting for data to come through. 
        yield return i;
    }
}

由编译器翻译为:

[AsyncIteratorStateMachine(typeof(<AEn>d__0))]
public static IAsyncEnumerable<int> AEn()
{
    return new <AEn>d__0(-2);
}

<AEn>d__0是编译器生成的IAsyncEnumerable的实现。

因此,应将堆栈实现用于深度优先搜索。

© www.soinside.com 2019 - 2024. All rights reserved.