2

我在这里有一个 Linq to XML 查询,但是在我查询的 XML 文档中,有很多重复的元素值被返回。到目前为止,这并没有造成问题,因为我的代码稍后会在使用数据构建树视图之前过滤掉重复项。

但是,我注意到如果有许多具有相同值的系统和子系统元素,我的程序会显着减慢。这是因为我的程序在过滤掉重复条目之前运行了大量代码。我认为在 Linq 阶段将它们过滤掉会更有效。唯一的问题是我不知道该怎么做。

我的 xml 示例如下所示,这是我的 Linq 查询:

XDocument doc = XDocument.Load(CSDBpath + projectName + "\\Data.xml");

                    var subsys = from sub in doc.Descendants("dataModule")
                                 where sub.Descendants("system").First().Value == sys
                                 select sub.Descendants("subsystem").First().Value;

                    foreach (var mysub in subsys)
                    {

                        buildSubSystemNodes(sys, mysub);
                        getUnits(sys, mysub); 
                    } 

因此,目前可能从 linq 查询中收集到数百个重复的“子系统”变量。我需要在我的 foreach 循环之前过滤掉这些。

这是 xml 文件的摘录。如您所见,所有这三个条目都具有相同的 Sys、Subsys 和 Subsubsys 元素值。有时有数百个相同的。我需要删除重复项。请帮忙!!

    <DMs>
      <dataModule>
        <DMC>DMC-PO-A-32-11-00-00A-00BA-C_001.SGM</DMC>
        <techName>Main Landing Gear</techName>
        <infoName>List of support equipment (normally used in front matter)</infoName>
        <modelic>PO</modelic>
        <system>32</system>
        <subsystem>11</subsystem>
        <subsubsystem>00</subsubsystem>
        <status>Checked In</status>
        <notes>-</notes>
        <currentUser>-</currentUser>
        <validator>-</validator>
        <dateMod>-</dateMod>
        <size>-</size>
      </dataModule>
      <dataModule>
        <DMC>DMC-PO-A-32-11-00-00A-00CA-C_001.SGM</DMC>
        <techName>Main Landing Gear</techName>
        <infoName>List of supplies (normally used in front matter)</infoName>
        <modelic>PO</modelic>
        <system>32</system>
        <subsystem>11</subsystem>
        <subsubsystem>00</subsubsystem>
        <status>Checked In</status>
        <notes>-</notes>
        <currentUser>-</currentUser>
        <validator>-</validator>
        <dateMod>-</dateMod>
        <size>-</size>
      </dataModule>
      <dataModule>
        <DMC>DMC-PO-A-32-11-00-00A-005A-C_001.SGM</DMC>
        <techName>Main Landing Gear</techName>
        <infoName>Lists of abbreviations</infoName>
        <modelic>PO</modelic>
        <system>32</system>
        <subsystem>11</subsystem>
        <subsubsystem>00</subsubsystem>
        <status>Checked In</status>
        <notes>-</notes>
        <currentUser>-</currentUser>
        <validator>-</validator>
        <dateMod>-</dateMod>
        <size>-</size>
      </dataModule>
      <dataModule>
</DMs>
4

1 回答 1

1

尝试使用下一个代码片段,它应该更健壮。但是再次 - 更仔细地考虑程序执行缓慢的主要原因是什么。

var subsys = doc.Descendants("dataModule")
                .Where(data => data.Element("system").Value == sys)
                .Select(data => data.Element("subsystem").Value)
                .Distinct();

foreach (var mysub in subsys)
{
    buildSubSystemNodes(sys, mysub);
    getUnits(sys, mysub); 
}

注意:我<dataModule>最后从你的 xml 中删除了开始标签,它没有结束标签

于 2013-05-16T17:00:00.607 回答