使用LINQ和委托实现递归函数

mmvthczy  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(142)

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

ulydmbyx

ulydmbyx1#

在第一个实现中只看到顶层的原因是因为Selectlazilyevaluated。它只在需要的时候才开始返回值,例如当你迭代它时(或者当你调用Sum或其他一些函数时)。如果你在Select之后添加一个ToList()调用,它就会工作。

htzpubme

htzpubme2#

    • 您必须 * 强制 * IEnumerable**--它很懒!(不一定总是这样,但要小心使用LINQ方法!)

在这种情况下,你丢弃了结果(和动作!)。哦,好吧!

a64a0gku

a64a0gku3#

您需要在第一个Select()调用中添加.ToList(),因为Linq函数是 lazy 的。在第二个调用中,由于List<>.ForEach()(顾名思义,List<>.ForEach()的作用与foreach语句的作用完全相同),递归可以正常工作。

相关问题