- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在解析 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);
关于c# - SelectMany 压平嵌套结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22988115/
有没有办法强制TSpeedButton重新绘制平坦? 使用触摸屏显示器时,鼠标不会移出按钮,因此即使您单击其他按钮,凸起的边框也会保留在屏幕上。 最佳答案 看起来这不是我可以在没有触摸屏的情况下重现的
我有一个包含很多 acroform 的 pdf,我对其进行了一些操作,从而生成了一个新的 pdf。所以我有 PDF-1(这是原始的)和 PDF-2(只是 PDF-1 的副本),现在我想合并它们。两个
我目前正在调查 RxJS's .merge但是我也会在这里问这个问题,因为我发现这里的解释有时非常精彩。 好的,我有一个根据用户输入打开模态窗口的表单,我订阅模态关闭事件并传回一些我将在调用/订阅服务
我是一名优秀的程序员,十分优秀!