پاك كردن Node هاي تكراري Xml با استفاده از Linq

فيد كاملي از وبلاگ هاي IT ايراني رو ميتونيد از اينجا  دانلود كنيد

ولي مشكلي كه بشخصه با اين ليست دارم تكراري بودن بعضي فيدهاس (البته منطقا تكراري نيست) به شكل زير توجه كنيد

خوب براي حذف كردن اين Node هاي تكراي از فايل OPML از LINQ استفاده ميكنيم

براي اين كار از متد  Distinct استفاده ميكنيم ولي نكته اي كه اينجا هست ما ميخواهيم برا اساس فيلدي كه ما مشخص ميكنيم عمل Distinct انجام بشه

براي اين كار بايد ما يك كلاس مجزا تعريف كنيم كه از EqualityComparer< T> Class  به ارث بره

using System.Collections.Generic;

namespace RemoveDuplicateNodes
{
    public class Opml
    {
        public string Text { get; set; }
        public string Title { get; set; }
        public string Type { get; set; }
        public string XmlUrl { get; set; }
        public string HtmlUrl { get; set; }

    }

    public class OpmlCompare : EqualityComparer<opml>
    {
        public override bool Equals(Opml x, Opml y)
        {
            return x.HtmlUrl.Equals(y.HtmlUrl);
        }

        public override int GetHashCode(Opml obj)
        {
            return obj.HtmlUrl.GetHashCode();
        }
    }
}

حالا موقع فراخواني متد Distinct بجاي استفاده از مقايسه گر پيش فرض از كلاس مقايسه گري كه تعريف كرديم استفااده ميكنيم

using System;
using System.Linq;
using System.Xml.Linq;

namespace RemoveDuplicateNodes
{
    class Program
    {
        static void Main(string[] args)
        {
            var document = XDocument.Load(@"C:\Users\MohammadSaheb\Downloads\google-reader-subscriptions.xml");

            var results = from node in document.Descendants("outline")
                          where node.Attribute("htmlUrl") != null
                          select new Opml
                                     {
                                         HtmlUrl = (string)node.Attribute("htmlUrl"),
                                         Text = (string)node.Attribute("text"),
                                         Title = (string)node.Attribute("title"),
                                         Type = (string)node.Attribute("type"),
                                         XmlUrl = (string)node.Attribute("xmlUrl")
                                     };


            Console.WriteLine("Before : " + results.Count() + "\t" + "After : " +
                              results.Distinct(new OpmlCompare()).Count());

            Console.ReadLine();
        }
    }
}

خروجي به شكل زير ميشه

نظرات

پست‌های معروف از این وبلاگ

lnav ابزاری بسیار کاربردی برای پیمایش لاگ ها در لینوکس و البته مک

ساختن ایمیج های داکری به کمک BuildKit - بخش دوم

ساختن ایمیج های داکری به کمک BuildKit - بخش اول