首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何“展开”“递归”结构

如何“展开”“递归”结构
EN

Stack Overflow用户
提问于 2010-01-06 10:39:00
回答 6查看 7.7K关注 0票数 38

不知道如何调用它,但假设您有一个类如下所示:

代码语言:javascript
运行
复制
class Person
{
    public string Name;
    public IEnumerable<Person> Friends;
}

然后,您有了一个person,并且您希望递归地“展开”这个结构,这样您就得到了一个没有重复的所有人员的列表。

你会怎么做?我已经做了一些似乎正在起作用的事情,但是我很好奇别人会怎么做,特别是如果Linq有内置的东西,你可以用一种聪明的方法来解决这个小问题:)

这是我的解决方案:

代码语言:javascript
运行
复制
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;
    }
}

会用到这样的东西:

代码语言:javascript
运行
复制
var people = somePerson.SelectRecursive(x => x.Friends);
EN

Stack Overflow用户

发布于 2021-11-20 03:25:11

虽然在可能有大量数据的情况下拥有IEnumerable是很棒的,但它值得记住递归添加到列表中的经典方法。

这可以这么简单(我忽略了选择器;只是递归地向输出列表演示):

代码语言:javascript
运行
复制
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);
    }
}

用法:

代码语言:javascript
运行
复制
Node rootNode = ...;
...
var all = rootNode.Flatten();
票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2012274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档