Найти дубликаты элементов - PullRequest
       14

Найти дубликаты элементов

1 голос
/ 22 февраля 2011

У меня есть следующий 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>

Я искал запрос LINQ, который бы возвращал дублирующиеся узлы.В приведенном выше XML есть два одинаковых узла.Результат должен включать оба дублирующих узла.

Мне также нужен запрос, который бы возвращал все узлы, которые не являются дубликатами.Пожалуйста, помогите.

Ответы [ 2 ]

5 голосов
/ 22 февраля 2011

Этот запрос приведет к списку дубликатов Cars записей в вашем XML, вы можете взять его оттуда:

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();

Нет смысла включать более одного узла для каждого дубликата в списке, потому что ... ну, они дубликаты. Точно так же вы можете отфильтровывать узлы, которые не дублируются с любым другим узлом Cars, просто измените условие where:

var uniqueCars = doc.Descendants("Cars")
                    .GroupBy(c => c.ToString())
                    .Where(g => g.Count() == 1)
                    .Select(g => g.First())
                    .ToList();
5 голосов
/ 22 февраля 2011

Я предлагаю вам создать класс Car и создать список Car экземпляров из XML и выполнить анализ этого списка.
Это упростит ситуацию, потому что вы можете перезаписать метод Equals класса Car, чтобы он возвращал только true, если все свойства одинаковы.

...