我的印象是,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-ieach的p2打印所有级别。
我认为Func只是一个函数def,所以递归是有效的。当然我的理解是错误的,有人可以解释
答案 0 :(得分:4)
您在第一个实施中仅看到顶级广告的原因是Select
为lazily evaluated。它只在需要时才开始返回值,例如当你迭代它时(或当你调用Sum
或许多其他函数时)。如果您在Select
之后添加ToList()
来电,则会有效。
答案 1 :(得分:1)
你必须强制 IEnumerable - 这是懒惰的! (它不一定总是,但要对LINQ方法保持警惕!)
在这种情况下,您将丢弃结果(以及操作!)。哦,好吧!
答案 2 :(得分:1)
您需要将.ToList()
添加到第一个Select()
调用,因为Linq函数是 lazy 。在第二次调用中,递归起作用因为List<>.ForEach()
(正如名称所代表的那样foreach
语句正是如此)。