2017-07-05 98 views
0

我經歷的職位搜索,但是這是竊聽我的: 我試圖從XML刪除重複項,只保留最新:的LINQ只選擇最新的副本

的XML結構爲:

<?xml version="1.0" encoding="utf-8"?> 
<scanneditems> 
    <item> 
    <itemnumber>5701075006328</itemnumber> 
    <description>Item 1</description> 
    <timestamp>16-06-2017 10:40:39</timestamp> 
    </item> 
    <item> 
    <itemnumber>5701075006328</itemnumber> 
    <description>Item 1 duplicate</description> 
    <timestamp>08-06-2017 14:25:51</timestamp> 
    </item> 
</scanneditems> 

的代碼是:

XDocument xDoc = XDocument.Load(@"C:\\fixthis.xml"); 

var item = xDoc.Element("scanneditems") 
    .Elements("item") 
    .GroupBy(c => c.Element("itemnumber").Value) 

    .OrderByDescending(p => p.Elements("timestamp").ToString()); 

XDocument doc = new XDocument(new XElement("scanneditems", item)); 
doc.Save("C:\\fixedfile.xml"); 

問題:我如何限制每個結果複製到最新的?

+0

我認爲你需要在默認情況下此代碼將時間戳按字母順序排序正確地排序它。然後只需撥打Distinct。 –

回答

0

如果我理解正確,您需要從每個副本中獲取最新的項目。
因此,使用OrderBy..內部分組的項目

XDocument xDoc = XDocument.Load(@"C:\\fixthis.xml"); 
var items = 
    xDoc.Element("scanneditems") 
     .Elements("item") 
     .GroupBy(c => c.Element("itemnumber").Value) 
     .Select(g => g.OrderByDescending(c => c.Element("timestamp").Value).First()); 

var doc = new XDocument(new XElement("scanneditems", items)); 
doc.Save("C:\\fixedfile.xml"); 
+0

非常感謝! 正是我在找的東西。 –