You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中如何通过LINQ扁平化嵌套Person对象列表获取所有ID?

用LINQ提取嵌套Person列表所有层级的ID

要从这种嵌套树形结构中提取所有层级的ID,LINQ本身没有内置的树形遍历方法,需要通过递归遍历来实现。下面是两种实用的实现方式:

方式一:自定义扩展方法(推荐,复用性强)

先写一个扩展方法,把树形结构的Person集合扁平化为一维集合,之后再用LINQ提取ID:

public static class PersonExtensions
{
    // 递归扁平化Person树形结构
    public static IEnumerable<Person> Flatten(this IEnumerable<Person> people)
    {
        foreach (var person in people)
        {
            yield return person; // 返回当前节点
            // 递归遍历子节点并返回
            foreach (var child in person.Children.Flatten())
            {
                yield return child;
            }
        }
    }
}

使用示例

调用扩展方法后,直接用Select提取ID即可:

List<int> allIds = personList.Flatten().Select(p => p.ID).ToList();

方式二:递归LINQ查询

如果不想写扩展方法,也可以直接写一个递归方法生成所有ID的序列:

// 递归获取所有层级的ID
IEnumerable<int> GetAllPersonIds(IEnumerable<Person> people)
{
    return people.SelectMany(p => 
        // 合并当前节点的ID和子节点的所有ID
        new[] { p.ID }.Concat(GetAllPersonIds(p.Children)));
}

// 使用
List<int> allIds = GetAllPersonIds(personList).ToList();

结果说明

针对你提供的示例数据,最终得到的allIds列表包含所有层级的ID:[1, 2, 3, 2, 4, 5, 6, 7](示例中有两个ID=2的节点,结果会保留这两个值)。

内容的提问来源于stack exchange,提问作者jahanzeb naqvi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:50:25