Linq to XML从结果中删除重复项

时间:2013-05-16 16:50:38

标签: c# linq-to-xml

我在这里有一个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>

1 个答案:

答案 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>标记,但没有关闭