c# - 使用 LINQ 和委托(delegate)执行递归函数

标签 c# linq

我的印象是 Func 和 Action 之间的唯一区别是前者必须有返回值。所以我认为您可以从 Func 或 Action 调用递归 linq。我是 C# 的新手,我只是在试验和好奇。

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

 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 的递归)仅打印顶层,而使用 Action-ie Foreach 的 p2 打印所有级别。

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

最佳答案

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

关于c# - 使用 LINQ 和委托(delegate)执行递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3087817/

相关文章:

c# - 在可枚举的可枚举上调用 .Distinct()

c# - 使用继承的参数化继承泛型

c# - 我有严重的内存泄漏问题吗?

c# - 使用 Linq 对组内的学生进行排序,然后重新排列组顺序

.net - DB4o Linq 查询 - 如何检查空字符串

c# - Enumerable.Single 的错误执行?

C# 'Newtonsoft.Json.Linq.JValue' 不包含 'Contains' 的定义

c# - 是否可以在服务器中使用Google Analytics(分析)?

c# - 佳能远程 SDK 替代品?

c# - C# 中的(Microsoft Report 或 Crystal Report)