我的印象是Func和Action之间的唯一区别是前者必须有一个返回值。所以我认为你可以从Func或Action调用递归linq。我是C#的新手,我只是在试验和好奇。
因此,我尝试了以下方法来递归打印Type中的嵌套类型。
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,所以递归是有效的。当然我的理解是错误的,有人能解释一下吗
3条答案
按热度按时间ulydmbyx1#
在第一个实现中只看到顶层的原因是因为
Select
是lazilyevaluated。它只在需要的时候才开始返回值,例如当你迭代它时(或者当你调用Sum
或其他一些函数时)。如果你在Select
之后添加一个ToList()
调用,它就会工作。htzpubme2#
在这种情况下,你丢弃了结果(和动作!)。哦,好吧!
a64a0gku3#
您需要在第一个
Select()
调用中添加.ToList()
,因为Linq函数是 lazy 的。在第二个调用中,由于List<>.ForEach()
(顾名思义,List<>.ForEach()
的作用与foreach
语句的作用完全相同),递归可以正常工作。