2013-05-16 44 views
2

我在這裏有一個Linq XML查詢,但在我查詢的XML文檔中有很多重複的元素值被返回。到目前爲止,我的代碼在用數據構建樹視圖之前過濾掉了重複的內容,這並沒有造成問題。Linq to 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查詢colected複製「SUBSYS」變量。我需要在我的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

確定,即性能瓶頸不在'buildSubSystemNodes'或'getUnits '? –

+0

檢查此問題:http://stackoverflow.com/questions/4085065/xml-linq-removing-duplicate-nodes-in-xelement-c-sharp –

+0

@IlyaIvanov - 我一直試圖調試代碼整個下午,並且我可以看到上述提取出來的XML文件和另一個不帶性能問題的XML文件之間唯一的區別是這個文件有很多重複的條目。這是唯一的區別。另一個相似的大小運行我的代碼,並在大約4秒內生成我的treeView。上述內容取自的XML文件需要長達3分鐘。我失去了它可能的其他東西。感謝下面的代碼,我會明天嘗試並相應地標記它。 – Daedalus

回答

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>標籤,它並沒有關閉一個

+0

Lvanov - 這工作!它現在加載大約3秒鐘,而不是大約3分鐘。我有點困惑,爲什麼它使這種差異,但它確實。非常感謝。 – Daedalus