这个javascript技巧是不是有C#对应物来避免过多的递归

Posted

技术标签:

【中文标题】这个javascript技巧是不是有C#对应物来避免过多的递归【英文标题】:Is there a C# counterpart to this javascript trick for avoiding too much recursion这个javascript技巧是否有C#对应物来避免过多的递归 【发布时间】:2020-09-03 10:18:30 【问题描述】:

javascript 中,当方法调用自身时,可以通过将递归调用包装在 setTimeout 中来防止“递归过多”错误。例如,此事件处理程序使用array.shift() 和递归而不是循环,一次将一项添加到可淘汰的可观察数组中:

$(document).on("AddPizzaFan", function (event, data, results) 

    var item = data.shift();
    var fan =   new PizzaFan(

                     item['firstname'],
                     item['lastname'],
                     item['favoritePizzaTopping']

        )
    myObservableArray.push(fan);
    if (data.length > 0) 
        setTimeout(function ()  $(document).trigger("AddPizzaFan", [data, myObservableArray]); , 1);
    

);

这种方法允许绑定到 KO observable 的 UI 组件一次更新一个数据行,即使 data 包含数千行并且可能需要 5 或 10 甚至 60如果 data 数组只是一次性全部输入到 UI,则会出现几秒钟或更长时间。当数组以许多小位被馈送到 UI 时,用户立即开始在屏幕上看到数据。 (FWIW,实际应用是文本语料库搜索,其中返回许多包含用户搜索词或搜索短语的文本段落。)

可以在 C# 中使用 Stack 和异步 await 完成与此类似的操作吗?阅读this question and answer,似乎不能,至少不容易。如果可以在 C# 中做类似的事情,它是如何实现的?

【问题讨论】:

您使用的是哪种用户界面? Windows 窗体? Windows Presentation Foundation? 您不需要依赖 JavaScript 技巧。 c# 有很多处理线程和异步编程的能力。忘记那些技巧,拥抱 c# 方法 @JesúsLópez:这正是我的问题。对应的 C# 方法有哪些。 @JesúsLópez:我的 UI 是 Blazor,在这里我是个完全的新手。 Blazor 服务器还是 Blazor WebAssembly? 【参考方案1】:

我认为您的代码可以在 c# 中实现如下:

递归实现:

async Task RecursiveTask(Stack<object> data, Queue<object> myObservableArray)

    if (data.Count > 0)
    
        myObservableArray.Enqueue(data.Pop()); // or any other logic
        await Task.Delay(1000);
        await RecursiveTask(data, myObservableArray);
    

非递归实现(推荐):

async Task RecursiveTask(Stack<object> data, Queue<object> myObservableArray)

    while (data.Count > 0)
    
        myObservableArray.Enqueue(data.Pop()); // or any other logic
        await Task.Delay(1000);
    

【讨论】:

只是递归是没有必要的 @JesúsLópez:你是对的。我尝试向 Tim recursive version 展示我也会用非递归版本更新我的答案,谢谢你的观点

以上是关于这个javascript技巧是不是有C#对应物来避免过多的递归的主要内容,如果未能解决你的问题,请参考以下文章

经验分享:自学编程常见的 8 种误区,初学者快来避坑

前端JavaScript小技巧「建议收藏」

一些关于c#中画图的方法技巧

C#黔驴技巧之实现统计结果排名

[小技巧]你真的了解C#中的Math.Round么?

如何从 C# 或 Javascript 检查文件是不是存在?