首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用LINQ和Delegates实现递归函数

使用LINQ和Delegates实现递归函数
EN

Stack Overflow用户
提问于 2010-06-22 03:28:07
回答 3查看 511关注 0票数 1

我的印象是,Func和Action之间唯一的区别是前者必须有一个返回value.So,我想你可以从Func或Action调用递归linq。我是C#的新手,我只是在尝试和好奇。

因此,我尝试了以下方法来递归地打印类型中的嵌套类型。

代码语言:javascript
复制
 Type t = typeof(Lev1);
 Action<Type> p1 = null, p2 = null;
 p1 = tn =>
     {
         Console.WriteLine(tn.Name);
         tn.GetNestedTypes().Select(x => { p1(x); return x; });
     };
 p2 = tn =>
     {
         Console.WriteLine(tn.Name);
         tn.GetNestedTypes().ToList().ForEach(x => { p2(x);});
     };
 p1(t);
 Console.WriteLine("=".PadRight(50, '='));
 p2(t);

所以我得到的结果是p1 (它使用Func-ie Select的递归)只打印顶层,而p2使用Action-ie Foreach打印所有级别。

我认为Func只是一个def函数,所以递归是有效的。当然我的理解是错的,有人能解释一下吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-22 03:39:11

在第一个实现中只看到顶层的原因是因为Selectlazily evaluated。它只在需要时才开始返回值,例如,当您迭代它时(或者当您调用Sum或许多其他函数时)。如果您在Select之后添加一个ToList()调用,它将会起作用。

票数 4
EN

Stack Overflow用户

发布于 2010-06-22 03:39:26

the IEnumerable -- it is lazy!你必须强迫你使用它--it is!(不必总是这样,但要小心LINQ方法!)

在这种情况下,您将丢弃结果(以及操作!)。哦,好吧!

票数 1
EN

Stack Overflow用户

发布于 2010-06-22 03:39:34

您需要将.ToList()添加到第一个Select()调用中,因为Linq函数是惰性的。在第二个调用中,递归之所以起作用是因为List<>.ForEach() (顾名思义,它做的正是foreach语句所做的事情)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3087817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档