我在这里有一个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);
}
所以目前可能有数百个重复的'subsys'变量从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>
答案 0 :(得分: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);
}
注意:我最后从xml中删除了开放<dataModule>
标记,但没有关闭