使用LINQ和Delegates执行递归函数

时间:2010-06-21 19:28:07

标签: c# linq

我的印象是,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,所以递归是有效的。当然我的理解是错误的,有人可以解释

3 个答案:

答案 0 :(得分:4)

您在第一个实施中仅看到顶级广告的原因是Selectlazily evaluated。它只在需要时才开始返回值,例如当你迭代它时(或当你调用Sum或许多其他函数时)。如果您在Select之后添加ToList()来电,则会有效。

答案 1 :(得分:1)

你必须强制 IEnumerable - 这是懒惰的! (它不一定总是,但要对LINQ方法保持警惕!)

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

答案 2 :(得分:1)

您需要将.ToList()添加到第一个Select()调用,因为Linq函数是 lazy 。在第二次调用中,递归起作用因为List<>.ForEach()(正如名称所代表的那样foreach语句正是如此)。