gpt4 book ai didi

c# - SelectMany 压平嵌套结构

转载 作者:行者123 更新时间:2023-11-30 19:26:24 27 4
gpt4 key购买 nike

我正在解析 XML 结构,我的类如下所示:

class MyXml
{
//...

List<Node> Content { get; set; }

//...
}

class Node
{
// ...

public List<Node> Nodes { get; set; }
public string Type { get; set; }

//...
}

MyXml代表我正在解析的XML文件,它的元素都叫<node> .每个节点都有一个类型属性,可以有不同的值。

节点的类型与其深度无关。我可以在任何深度级别拥有任何节点类型。

我可以正确解析结构,所以我得到一个 MyXml 对象,其内容是一个节点列表,列表中的每个节点都可以有子节点等等(我为此使用了递归)。

我需要做的是展平整个结构并仅提取特定类型的节点。

我试过:

var query = MyXml.Content.SelectMany(n => n.Nodes);

但它只采用结构深度为 1 的节点。我想在同一个集合中抓取每个节点,无论深度如何,然后过滤我需要的。

最佳答案

这是一个自然递归的问题。使用递归 lambda,尝试类似的操作:

Func<Node, IEnumerable<Node>> flattener = null;
flattener = n => new[] { n }
.Concat(n.Nodes == null
? Enumerable.Empty<Node>()
: n.Nodes.SelectMany(flattener));

请注意,当您像这样进行递归Func时,您必须先单独声明Func,并将其设置为null。

您还可以使用迭代器 block 方法展平列表:

public static IEnumerable<Node> Flatten(Node node)
{
yield return node;
if (node.Nodes != null)
{
foreach(var child in node.Nodes)
foreach(var descendant in Flatten(child))
yield return descendant;
}
}

无论哪种方式,一旦树被展平,您就可以对展平列表执行简单的 Linq 查询以查找节点:

flattener(node).Where(n => n.Type == myType);

响应改编自:https://stackoverflow.com/a/17086572/1480391

关于c# - SelectMany 压平嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22988115/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com