不知道如何调用它,但假设您有一个类如下所示:
class Person
{
    public string Name;
    public IEnumerable<Person> Friends;
}然后,您有了一个person,并且您希望递归地“展开”这个结构,这样您就得到了一个没有重复的所有人员的列表。
你会怎么做?我已经做了一些似乎正在起作用的事情,但是我很好奇别人会怎么做,特别是如果Linq有内置的东西,你可以用一种聪明的方法来解决这个小问题:)
这是我的解决方案:
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> subjects, Func<T, IEnumerable<T>> selector)
{
    // Stop if subjects are null or empty
    if(subjects == null)
        yield break;
    // For each subject
    foreach(var subject in subjects)
    {
        // Yield it
        yield return subject;
        // Then yield all its decendants
        foreach (var decendant in SelectRecursive(selector(subject), selector))
            yield return decendant;
    }
}会用到这样的东西:
var people = somePerson.SelectRecursive(x => x.Friends);发布于 2021-11-20 03:25:11
虽然在可能有大量数据的情况下拥有IEnumerable是很棒的,但它值得记住递归添加到列表中的经典方法。
这可以这么简单(我忽略了选择器;只是递归地向输出列表演示):
class Node
{
    public readonly List<Node> Children = new List<Node>();
    public List<Node> Flatten()
    {
        var all = new List<Node>();
        Flatten(ref all);
        return all;
    }
    public void Flatten(List<Node> all)
    {
        all.Add(this);
        foreach (var child in Children)
            child.Flatten(all);
    }
}用法:
Node rootNode = ...;
...
var all = rootNode.Flatten();https://stackoverflow.com/questions/2012274
复制相似问题