遍历linq结果导致的项目多于查询数量

时间:2019-01-28 19:14:46

标签: c# linq

我对LINQ并不陌生,但这似乎很简单。

我有一个XML文档,其中包含这样的结构:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<folders>
  <folder id="-1" parent="-100">
    <name><![CDATA[Root]]></name>
    <children>
      <folder id="2" parent="-1">
        <name><![CDATA[Contribution]]></name>
        <documents />
        <children>
          <folder id="775" parent="2">
            <name><![CDATA[category1]]></name>
            <documents />
            <children>
              <folder id="2319" parent="775">
                <name><![CDATA[Acad_Depts1]]></name>
                <documents />
                <children>
                  <folder id="26965" parent="2319">
                    <name><![CDATA[Student1]]></name>
                    <documents>
                      <document>
                      </document>
                    </documents>
                  </folder
                </children>
              </folder>
              <folder id="2319" parent="775">
                <name><![CDATA[Acad_Depts2]]></name>
                <documents />
                <children>
                  <folder id="26965" parent="2319">
                    <name><![CDATA[Student1]]></name>
                    <documents>
                      <document>
                      </document>
                    </documents>
                  </folder
                </children>
              </folder>
              etc...
            </children>
          </folder>
        </children>
      </folder>
    </children>
  </folder>
</folders>

我想做的是选择所有具有'parent =“ 775”'属性的元素。

XElement xelement = XElement.Load("folders_only_registrar_folder.xml");
IEnumerable <XElement> folders = xelement.Elements();

var query = from node in folders.Descendants("folder")
            where node.Attribute("parent").Value == registrarNodeID
            select node;

Console.WriteLine(query.Count());
Console.ReadKey();

foreach(XElement departmentNode in query.Descendants("name"))
{
          Console.WriteLine(departmentNode.Value.ToString());
}

当我运行查询并测试计数时,我得到48个结果(很好)...但是当我尝试写出这些相同的节点时,我得到了数百个结果。由于某种原因,它给了我几乎所有名为“文件夹”的元素,包括子文件夹。

关于我做错了什么?

更新...好吧,现在我知道为什么我要得到所有文件夹了,但是对如何创建节点和子节点的每个分组的集合有任何想法吗?

LINQ中的选择是否可以将每个775文件夹节点(加上它的集合子节点)发送到某种类型的节点集合中,然后我可以通过对节点进行分组在foreach中对它们进行解析?

1 个答案:

答案 0 :(得分:3)

仅用query.Descendants()替换queryquery.Descendants()获取最初包含在query中的每个节点的每个子节点。