我的印象是,Func和Action之间唯一的区别是前者必须有一个返回value.So,我想你可以从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函数,所以递归是有效的。当然我的理解是错的,有人能解释一下吗?
发布于 2010-06-22 03:39:11
在第一个实现中只看到顶层的原因是因为Select是lazily evaluated。它只在需要时才开始返回值,例如,当您迭代它时(或者当您调用Sum或许多其他函数时)。如果您在Select之后添加一个ToList()调用,它将会起作用。
发布于 2010-06-22 03:39:26
the IEnumerable -- it is lazy!你必须强迫你使用它--it is!(不必总是这样,但要小心LINQ方法!)
在这种情况下,您将丢弃结果(以及操作!)。哦,好吧!
发布于 2010-06-22 03:39:34
您需要将.ToList()添加到第一个Select()调用中,因为Linq函数是惰性的。在第二个调用中,递归之所以起作用是因为List<>.ForEach() (顾名思义,它做的正是foreach语句所做的事情)。
https://stackoverflow.com/questions/3087817
复制相似问题