代码之家  ›  专栏  ›  技术社区  ›  josephj1989

使用LINQ和委托执行递归函数

  •  1
  • josephj1989  · 技术社区  · 16 年前

    我觉得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的递归)只打印顶级,而p2使用action ie foreach打印所有级别。

    我认为func只是一个函数def,所以递归是有效的。当然我的理解是错误的,有人能解释一下吗

    3 回复  |  直到 16 年前
        1
  •  4
  •   Ronald Wildenberg    16 年前

    您在第一个实现中只看到顶级的原因是 Select lazily evaluated . 它只在需要时开始返回值,例如当您迭代它时(或当您调用 Sum 或者其他一些功能)。如果添加 ToList() 呼叫后 选择 它会起作用的。

        2
  •  1
  •   user166390    16 年前

    你必须 可枚举的 ——太懒了!(不必总是这样,但要小心使用LINQ方法!)

    在这种情况下,您将放弃结果(和操作!)哦,好吧!

        3
  •  1
  •   UserControl    16 年前

    你需要添加 .ToList() 到第一 Select() 调用,因为Linq函数 懒惰的 . 在第二个调用中,由于 List<>.ForEach() (顾名思义 foreach 语句执行)。