我的印象是 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,所以递归是有效的。当然我的理解是错误的,谁能解释一下
最佳答案
您在第一个实现中只看到顶层的原因是因为 Select
是lazily evaluated .它仅在需要时才开始返回值,例如当您对其进行迭代时(或当您调用 Sum
或许多其他函数时)。如果您添加 ToList()
在 Select
之后调用,它将起作用。
关于c# - 使用 LINQ 和委托(delegate)执行递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3087817/