SelectMany展开嵌套结构我正在解析XML结构,我的类如下所示:放;}//...}classNode{//...publicListNodes{get;放;}公共字符串类型{得到;放;}//...}MyXml代表我正在解析的XML文件,它的元素被调用。每个节点都有一个类型属性,可以有不同的值。节点的类型与其深度无关。我可以在任何深度级别拥有任何节点类型。我可以正确地解析结构,所以我得到一个MyXml对象,其内容是一个节点列表,列表中的节点可以有子节点等等(我使用递归)。我需要做的是展平整个结构并只提取某种类型的节点。我试过:varquery=MyXml.Content.SelectMany(n=>n.Nodes);但它只需要结构深度为1的节点。我想抓取同一个集合中的每个节点,无论多深,然后过滤出我需要的。这是一个自然递归的问题。使用递归lambda,尝试类似的东西:Func>flattener=null;flattener=n=>new[]{n}.Concat(n.Nodes==null?Enumerable.Empty():n.Nodes.SelectMany(flattener));需要注意的是,当你做这样一个递归的Func时,你必须先单独声明这个Func,然后将它设置为null。您还可以使用迭代器块方法展平列表:publicstaticIEnumerableFlatten(Nodenode){yieldreturnnode;if(node.Nodes!=null){foreach(node.Nodes中的varchild)foreach(Flatten(child)中的vardescendant)yieldreturndescendant;无论哪种方式,一旦树被展平,您可以在展平列表上执行简单的Linq查询以查找节点:flattener(node).Where(n=>n.Type==myType);响应改编自:https://stackoverflow.com/a/17086572/1480391您应该实现返回节点本身的Node.GetFlattened方法,然后在所有子节点上调用自身:publicIEnumerableGetFlattened(){yieldreturnthis;foreach(varnodeinthis.Nodes.SelectMany(n=>n.GetFlattened()))yieldreturnnode;然后,您可以调用此方法并递归返回所有节点,而不管它们有多深。这是深度优先搜索,如果你想要广度优先搜索,你就得试试别的了。classMyXml{publicListAllNodes(){ListallNodes=newList();foreach(内容中的var节点)AddNode(节点,节点);}publicvoidAddNode(Nodenode,Listnodes){nodes.Add(node);foreach(varchildNodeinnode.Nodes)A??ddNode(childNode,nodes);}publicListAllNodesOfType(NodeTypenodeType){returnAllNodes().Where(n=>n.NodeType==nodeType);}}首先使用函数并查询Flattenthelist。以上就是C#学习教程的全部内容:SelectMany扁平化嵌套结构。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
