.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
相关产品推荐
相关产品推荐

