Удалить повторяющиеся записи из XDocument - PullRequest
1 голос
/ 20 июля 2011

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

XDocument rssDocDistinct = new XDocument(new XElement("rss",  
   new XElement("channel", 
      from node in rssDoc.Element("rss").Element("channel").Descendants("item") 
         select node)));

Может кто-нибудь помочь мне понять, как получить только отдельные "элементы" в rssDoc? Я не хочу дубликатов.

Спасибо за любую помощь.

Edit:

<rss version="2.0">
   <channel>
      <title></title>
      <link></link>
      <description></description>
      <copyright></copyright>
      <ttl></ttl>
      <item>
         <title></title>
         <description></description>
         <link></link>
         <pubDate></pubDate>
      </item>
      <item>
         <title></title>
         <description> </description>
         <link></link>
         <pubDate></pubDate>
      </item>
    </channel>
</rss>

rssDocDistinct должен выглядеть следующим образом без повторяющихся элементов элемента (элемент с таким же названием, ссылкой, описанием, pubDate будет отображаться только один раз)

  <item>
     <title></title>
     <description></description>
     <link></link>
     <pubDate></pubDate>
  </item>
  <item>
     <title></title>
     <description> </description>
     <link></link>
     <pubDate></pubDate>
  </item>

Edit: Спасибо за помощь, ребята, я понял, как создать IEqualityComparer, как предложил Полищук.

public class ItemComparer : IEqualityComparer<XElement>
    {
        #region IEqualityComparer<XElement> Members

        public bool Equals(XElement x, XElement y)
        {
            return (string)x.Element("title") == (string)y.Element("title")
                && (string)x.Element("description") == (string)y.Element("description")
                && (string)x.Element("link") == (string)y.Element("link")
                && (string)x.Element("pubDate") == (string)y.Element("pubDate");
        }

        public int GetHashCode(XElement obj)
        {
            return ((string)obj.Element("title")).GetHashCode()
                + ((string)obj.Element("description")).GetHashCode()
                + ((string)obj.Element("link")).GetHashCode()
                + ((string)obj.Element("pubDate")).GetHashCode();
        }

        #endregion
    }

1 Ответ

1 голос
/ 20 июля 2011

Посмотрите на Enumerable.Distinct метод расширения. Реализуйте свой собственный IEqualityComparer<XElement> или (предпочтительно) унаследованный от класса EqualityComparer<T>, с вашей собственной логикой отличия, основанной на ваших потребностях. Используйте его, например ::100100

var comparer = new YourXElementComparer();
XDocument rssDocDistinct = new XDocument(new XElement("rss",  
   new XElement("channel", 
      from node in rssDoc.Element("rss").Element("channel").Descendants("item")
            .Distinct(comparer) 
         select node)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...