问题
I have the below XML
<Automobiles>
<Cars>
<YearofMfr>2010</YearofMfr>
<Mileage>12</Mileage>
<MeterReading>1500</MeterReading>
<Color>Red</Color>
<Condition>Excellent</Condition>
</Cars>
<Cars>
<YearofMfr>2010</YearofMfr>
<Mileage>12</Mileage>
<MeterReading>1500</MeterReading>
<Color>Red</Color>
<Condition>Excellent</Condition>
</Cars>
<Cars>
<YearofMfr>2008</YearofMfr>
<Mileage>11</Mileage>
<MeterReading>20000</MeterReading>
<Color>Pearl White</Color>
<Condition>Good</Condition>
</Cars>
</Automobiles>
I was looking for a LINQ Query which would return duplicate nodes. In the above XML there are two nodes which are similar. The result should include both the duplicate nodes.
I also need a query which would return all the nodes which are not duplicate. Please help.
回答1:
I suggest, you create a Car class and create a list of Car instances from the XML and do your analysis on that list.
It would simplify things, because you could overwrite the Equals method of the Car class to only return true, if all properties are the same.
回答2:
This query would result in the list of duplicate Cars entries in your XML, you could take it from there:
XDocument doc = XDocument.Load(@"test.xml");
var duplicates = doc.Descendants("Cars")
.GroupBy(c => c.ToString())
.Where(g => g.Count() > 1)
.Select(g => g.First())
.ToList();
There's no point in including more than one node for each duplicate in the list because..well they're duplicates. Similarly you can filter out the nodes that are not duplicates with any other Cars node, just change the where condition:
var uniqueCars = doc.Descendants("Cars")
.GroupBy(c => c.ToString())
.Where(g => g.Count() == 1)
.Select(g => g.First())
.ToList();
来源:https://stackoverflow.com/questions/5076772/find-duplicate-xelements